2009-10-25 17 views
6

Napisałem aplikację, która używa sqlite i działa świetnie na większość systemów. Jest napisany w języku C#, a jedynym nie-ramowym zbiorem jest sqlite, który jest zawarty w System.Data.SQLite.dll.Na niektórych komputerach aplikacja nie może załadować pliku sqlite dll

Rozmieszczam to w taki sam sposób na wszystkich komputerach (kopiowanie wkleja plik exe, plik bazy danych i plik System.Data.SQLite). Działa doskonale na wszystkich moich komputerach i większości komputerów, które wypróbowałem.

Ale wtedy mamy doniesienia, że ​​dla niektórych ludzi rzuca następujący wyjątek:

Nie można załadować pliku lub zestawu „System.Data.SQLite, Version = 1.0.65.0, Kultura = neutralny, PublicKeyToken = db937bc2d44ff139 'lub jedną z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie .

Teraz upewniłem się, że plik dll znajduje się w tym samym folderze, co plik aplikacji exe. Jest to ta sama biblioteka dll, o tej samej wersji, co podano w powyższym komunikacie o wyjątku.

Byłem bardzo zdezorientowany przez to, więc stworzyłem świeżą maszynę wirtualną, zainstalowałem na niej Windows 7 i po prostu skopiowałem pliki, i wszystko działało. Więc jeśli działa on w nowych oknach, nie mogę sobie wyobrazić, co inne komputery mogły zaginąć ...

Uwaga: Dwie z tych maszyn, na których projekt zgłasza wyjątek, również korzystają z systemu Windows 7 profesjonalnie.

będę naprawdę wdzięczny za każdą pomoc w tej sprawie, bo jestem świeżo po pomysłów ...

Odpowiedz

12

Oto możliwość: Czy różnica między maszyn roboczych i nie-pracujących 32-bitowe vs. 64- kawałek? Czy budujesz dla "Dowolnego procesora", kiedy powinieneś budować tylko dla zewnętrznej biblioteki DLL?

+0

Dziękujemy! Całkowicie przegapiłem, że sqlite.NET ma dwa różne pliki dll - dla x32 i x64. Zmieniłem biblioteki DLL na komputerach, na których nie działa i teraz działa. Nigdy nie myślałem, aby zapytać ich o 32 vs 64-bitowy ... –

+0

Czy istnieje sposób sprawdzenia w czasie wykonywania, jeśli platforma jest 32/64 bitowy i działać odpowiednio w tym przypadku? – Ben

+0

@Ben: Obawiam się, że nie wiem. Musisz dynamicznie załadować bibliotekę DLL sqlite w środowisku wykonawczym, ale nie wiem jak to zrobić w .net. – RichieHindle

1

Jest możliwe, że na komputerach, które rzucają wyjątek, działa 64-bitowa wersja systemu Windows i program używa konfiguracji AnyCPU. DLL System.Data.SQLite to bestia o dwóch twarzach: zarządzana część i natywna część. Być może natywna część jest odpowiedzialna za wyjątek.

Aby uzyskać więcej informacji, patrz this question.

1

Czy sprawdziłeś, czy system docelowy jest 64-bitowy czy 32-bitowy?

Możliwe, że jedna z twoich zależności wymaga 32-bitowej wersji systemu Windows. Aby rozwiązać problem, możesz określić cel platformy we właściwościach twojego projektu C#: Wybierz x86 zamiast Dowolnego procesora.

Powiązane problemy