Van egy alkalmazásunk, ami .NET Framework 4.0 Client Profile-t és SQL Server Compact Editiont használ, ClickOnce-szal települ, és ha szükséges, telepíti maga alá a Frameworköt is. Nincs benne semmi olyan, ami miatt ne futhatna régebbi Windowsokon, ami kell is, mert a felhasználóknál részben XP-k vannak. Az új verzió tesztelése közben szokás szerint felhúztam egy friss XP-s virtuális gépet, amire az alkalmazás új verziója sikeresen települt is, azonban az első adatbázis műveletnél az alábbi hibával elszállt:
System.DllNotFoundException: Unable to load DLL ‘sqlceme35.dll’: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
A hivatkozott fájl természetesen ott volt a diszken, ahol a korábbi verziókban is, sőt a program új verziójába nem is kerültek olyan változások, amik ezt a hibát indokolták volna, ezért jogosan merült fel a kérdés, hogy mi változott?
A hiba nem jött elő sem Windows 8.1-en, sem Windows 7-en, sőt még azokon a régebben használt XP-s gépeken sem, amiken fent volt az alkalmazás korábbi verziója, és most csak frissítettük. És bár a korábbi verzió vígan futott XP-n, az új virtuális gépben ugyanolyan hibát produkált, mint az új verzió, így adódott a következtetés, hogy a virtuális gépben volt az eltérés.
Először a modern.ie oldalról letöltött virtuális gépet használtam, és arra gyanakodtam, hogy annak van valami specifikuma. Azután telepítettem egy saját virtuális gépet úgy, hogy az alap XP+SP3 telepítőre hosszú órák alatt keservesen felkínlódtam az összes Windows Update frissítést. A jelenség ugyanaz.
Végül ILSpy-jal belenéztem a programmal települő System.Data.SqlServerCe szerelvénybe, és mivel az még a .NET Framework 2.0 verziójára hivatkozott, próbaként feltelepítettem a régi Framework verziót. Csodák csodája a probléma megoldódott.
Az eset érdekességei:
- A Windows Update nem telepítette a .NET Framework 2.0-át, csak az újabb verziókat. Ez régebben nem így volt.
- A 4.0 Client Profile nem volt elég, mellé fel kellett telepíteni a 2.0 verziót.
- Érthető, hogy Windows 7-en nem jött elő a hiba, hiszen ott az operációs rendszer része a .NET 2.0, de vajon miért ment simán 8.1-en, ahol alapból nincs feltéve a .NET 2.0?
Technorati-címkék:
SQL Compact Edition