Nie można załadować pliku lub zestawu „System.Data.SQLite”


126

Zainstalowałem ELMAH 1.1 .Net 3.5 x64 w moim projekcie ASP.NET i teraz pojawia się ten błąd (za każdym razem, gdy próbuję wyświetlić dowolną stronę):

Nie można załadować pliku lub zestawu „System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.

Opis: wystąpił nieobsługiwany wyjątek podczas wykonywania bieżącego żądania internetowego. Zapoznaj się ze śledzeniem stosu, aby uzyskać więcej informacji na temat błędu i miejsca jego powstania w kodzie.

Szczegóły wyjątku: System.BadImageFormatException: nie można załadować pliku lub zestawu „System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.

Więcej informacji o błędach na dole.

Moja platforma Active Solution to "Dowolny procesor" i pracuję na x64 Windows 7 na procesorze x64, oczywiście. Powodem, dla którego używamy tej wersji ELMAH, jest to, że 1.0 .Net 3.5 (x86, który jest jedyną platformą, dla której jest skompilowany) dał nam ten sam błąd na naszym serwerze x64 Windows.

Próbowałem kompilować dla x86 i x64 i otrzymuję ten sam błąd. Próbowałem usunąć wszystkie dane wyjściowe kompilatora (bin i obj). Wreszcie odniosłem się bezpośrednio do biblioteki dll SQLite, coś, co nie było potrzebne, aby projekt działał na serwerze i otrzymałem ten błąd kompilatora:

Błąd 1 Ostrzeżenie jako błąd: Generowanie zestawu - zestaw, do którego odwołuje się „System.Data.SQLite.dll”, jest przeznaczony dla innego procesora MyProject

Jakieś pomysły na czym może polegać problem?

Więcej informacji o błędzie:

Błąd źródła:

Podczas wykonywania bieżącego żądania internetowego został wygenerowany nieobsługiwany wyjątek. Informacje dotyczące pochodzenia i lokalizacji wyjątku można zidentyfikować za pomocą poniższego śladu stosu wyjątków.

Ślad stosu:

[BadImageFormatException: nie można załadować pliku lub zestawu „System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139” lub jednej z jego zależności. Podjęto próbę załadowania programu w nieprawidłowym formacie.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection. .nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark & ​​stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackeanCrawlRospection & stackMark. +2. Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: nie można załadować pliku lub zestawu „System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +203 System.Web.Configuration .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPath, Boolean supportLocalization, String, String)
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.

[HttpException (0x80004005): nie można załadować pliku lub zestawu „System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironment.Initialize ( ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729

[HttpException (0x80004005): nie można załadować pliku lub zestawu „System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.]
System.Web.HttpRuntime.FirstRequestInit (kontekst HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (kontekst HttpContext) +85
System.Web.HttpRuntime.ProcessRttpequest ) +259


W takich przypadkach dziennik Fusion (wiązania zespołu) jest znacznie bardziej przydatny niż ten arkusz śladu stosu.
Anton Tykhyy

1
Wygląda na to, że problem polegał na tym, że Cassini to x86.
pupeno

Miałem ten sam problem i musiałem zrezygnować z ELMAH z powodu mieszanego środowiska produkcyjnego / programistycznego, które mamy. Biorąc pod uwagę, że używanie SQLite na produkcyjnym serwerze WWW o dużym ruchu nie brzmi zbyt dobrze i fakt, że SQLite dll jest jedynym zestawem w ELMAH, który wymusza na nim dwie różne wersje dla bitów x86 i 64x, zastanawiam się, dlaczego faceci z ELMAH ciągną i uczyń to opcjonalnym, a nie tym, czym jest teraz.
Khash,

Odpowiedzi:


122

System.Data.SQLite.dlljest zestawem mieszanym, tzn. zawiera zarówno kod zarządzany, jak i kod natywny. Dlatego konkretny element System.Data.SQLite.dllto x86 lub x64, ale nigdy oba.

Aktualizacja ( dzięki uprzejmości J. Pablo Fernandeza ): Cassini, programistyczny serwer sieciowy używany przez Visual Studio po naciśnięciu klawisza F5 lub kliknięciu zielonego przycisku «odtwarzanie», to tylko x86, co oznacza, że ​​nawet jeśli twoja stacja robocza jest x64, będziesz w stanie korzystać z wersji System.Data.SQLite.dll x86.

Alternatywą jest nie użycie Cassini, ale IIS7, który jest poprawnie x64.


3
Używam wersji x64 na komputerze x64.
pupeno

Czy próbowałeś użyć wersji x86?
Anton Tykhyy

2
Nową alternatywą, która pojawiła się wkrótce temu, jest użycie IIS Express, które pozwala ustawić typ puli aplikacji, której chcesz użyć
Raul Vejar

@Raul Vejar: proszę wyjaśnić, w jaki sposób funkcja wyboru puli aplikacji w IIS Express rozwiązuje problem montażu 32-bitowego / 64-bitowego. Dzięki
Tim

@Tim, ta funkcja pozwala wybrać typ puli aplikacji, której chcesz użyć, 32 lub 64-bitowy, w ten sposób możesz kontrolować ten aspekt, który został naprawiony w Cassini i pracować z tą samą biblioteką bitów, którą masz. Innymi słowy, jeśli używasz 32-bitowej wersji biblioteki dll SQLite, powinieneś wybrać 32-bitową pulę aplikacji w IIS Express. W przypadku 64-bitowej wersji biblioteki należy wybrać 64-bitową pulę aplikacji.
Raul Vejar

77

Upewnij się, że opcja „Włącz aplikacje 32-bitowe” jest ustawiona na wartość fałsz dla puli aplikacji.


2
Działa to, jeśli chcesz używać biblioteki dll x86 na komputerze 64-bitowym. W naszym przypadku nasze środowiska deweloperskie i produkcyjne nie pasują do siebie, więc to działało najlepiej.
Rob

17
Ustawienie tego na prawdę faktycznie rozwiązało problem. Domyślam się, że Elmah jest domyślnie dostarczany z 32-bitowym zestawem sql lite.

1
+1 zarówno dla @Jirapong, jak i Sergeya, ponieważ było to ustawienie, którym musiałem manipulować, aby wszystko działało. W moim przypadku wydaje mi się, że miałem wersję x86 biblioteki SqlLite DLL i potrzebowałem opcji Włącz aplikacje 32-bitowe, aby ustawić wartość „prawda”.
t3rse

43

Przejdź do IIS7 Application Pool -> advanced settings and set the 32-bit application to true.


Używam Windows 7 i napotkałem ten problem; włączenie wersji 32-bitowej naprawiło problem, prawdopodobnie dlatego, że moja kopia biblioteki DLL była 32-bitowa.
Doug,

1
FYI: Wymagane było ustawienie tożsamości puli aplikacji na LocalSystem, aby to działało: ^
Illuminati,

I upewnij się, że masz wersję Win32 pliku SQLite.Interop.dll stackoverflow.com/questions/4816529/ ...
Morten Holmgaard

14

Jest to bardzo proste, jeśli nie używasz SQLite:

Możesz usunąć biblioteki DLL SQLite z folderów bin rozwiązania, a następnie z folderu, w którym odwołujesz się do ELMAH. Przebuduj, a Twoja aplikacja nie będzie próbowała załadować tej biblioteki DLL, której nie używasz.


5
+1 Jeśli nie używasz SQLite, to po co naprawiać odnośną bibliotekę DLL? Ładny, elegancki i właśnie to, czego potrzebowałem.
bhavinb

To działało lokalnie, ale po wdrożeniu na platformie Azure pojawił się błąd.
stuartdotnet

8

Mam 64-bitową maszynę deweloperską i 32-bitowy serwer kompilacji. Użyłem tego kodu przed inicjalizacją NHibernate. Działa urok na każdej architekturze (dobrze 2, które testowałem)

Mam nadzieję, że to komuś pomoże.

Guido

        private static void LoadSQLLiteAssembly()
        {
            Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
            FileInfo fi = new FileInfo(dir.AbsolutePath);           
            string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
            if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
        }

        private static string GetAppropriateSQLLiteAssembly()
        {
            string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
            return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
        }

Czy ktoś z powodzeniem użył tej techniki? Wypróbowałem to w testowym rozwiązaniu aplikacji mvc asp.net i nie zadziałało.
Glenn

1
Zamiast przechodzić do zmiennej środowiskowej, możesz bezpośrednio użyć CLR: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse

2
Lub właściwość Environment.Is64BitProcess (od .NET4).
riezebosch

5

W naszym przypadku nie zadziałało, ponieważ brakuje naszego serwera produkcyjnego

Pakiet redystrybucyjny programu Microsoft Visual C ++ 2010 SP1 (x86)

Zainstalowaliśmy go i wszystko działa dobrze. Pula aplikacji musi mieć ustawienie Włącz aplikacje 32-bitowe na wartość true i musisz mieć wersję biblioteki x86


1
Pracuje dla mnie. Po prostu wyświetla komunikat o błędzie bez wskazywania braku biblioteki C, co jest okropne.
brk

1
Dla mnie zainstalowałem vcredist 2008 x64 dla System.Data.SQLite, Version = 1.0.99.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139
themadmax

5

Jako ktoś, kto miał do czynienia z kilkoma raportami błędów na Roadkill Wiki z dokładnie tym samym problemem, oto co musisz zrobić:

  • Czy używasz x64 czy x86? Sqlite zawiera biblioteki DLL dla oddzielnych architektur - skopiuj właściwą do folderu bin, istnieją dwie biblioteki DLL dla oficjalnego dostawcy:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Jeśli nie możesz zawracać sobie głowy szukaniem tych zestawów, włącz tryb 32-bitowy dla puli aplikacji (rozwiązanie zwykle tylko dla maszyn deweloperskich)
  • Jeśli hostujesz na serwerze, będziesz potrzebować pakietu redystrybucyjnego Microsoft C ++ Runtime - nie jest on domyślnie instalowany na serwerze 2008 R2. wersja x64 , x86 wersja

To prawdziwy ból w dupie, ile razy musisz przeskoczyć podczas ponownej dystrybucji plików binarnych SQLite .NET, moim rozwiązaniem dla Roadkill było skopiowanie poprawnych plików binarnych do folderu ~ / bin w oparciu o architekturę, której używasz . Niestety to nie rozwiązuje problemu z uruchomieniem C ++.


5

Rozwiązałem to, instalując System.Data.SQLite z rozszerzeniem Nuget. To rozszerzenie może być używane w programie Visual Studio 2010 lub nowszym. Najpierw musisz zainstalować rozszerzenie Nuget. Możesz śledzić tutaj:

  • Przejdź do Visual Studio 2010, Menu -> Narzędzia
  • Wybierz Menedżera rozszerzeń
  • Wprowadź NuGet w polu wyszukiwania i kliknij opcję Galeria online. Czekam Pobierz informacje…
  • Wybierz pobrany Menedżer pakietów NuGet, kliknij przycisk Pobierz. Czekam na pobranie…
  • Kliknij przycisk Zainstaluj w Menedżerze pakietów NuGet Instalatora rozszerzeń programu Visual Studio. Zaczekaj na zakończenie instalacji.
  • Kliknij Zamknij i Uruchom ponownie teraz.

Po drugie, możesz teraz zainstalować SQLite:

A teraz możesz użyć System.Data.SQLite.

W tym przypadku zobaczysz dwa foldery x64 i x86, te foldery zawierają SQLite.Interop.dll. Teraz przejdź do okien właściwości tych bibliotek dll i ustaw akcję kompilacji na zawartość, a Kopiuj do katalogu wyjściowego to Kopiuj zawsze.

Więc to moja droga.

Dzięki. Kim Tho Pham, HoChiMinh City, Wietnam. E-mail: tho.phamkim@gmail.com


4

Ręczne ładowanie związane z zestawem System.Data.SQLite może rozwiązać ten problem.

Zmieniono kod gatapia, jak poniżej:

    public static void LoadSQLLiteAssembly()
    {
        Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
        FileInfo fi = new FileInfo(dir.AbsolutePath);
        string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
        Assembly.LoadFrom(appropriateFile);
    }

    private static string GetAppropriateSQLLiteAssembly()
    {
        string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
        string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
        return "System.Data.SQLite.x" + arch + ".DLL";
    }

4

Otrzymałem ten błąd, gdy nasz serwer Windows został przekonwertowany z 32-bitowego systemu operacyjnego na 64-bitowy. Zestaw, który generował błąd, został ustawiony na kompilację w trybie x86 (tj. W trybie 32). Przełączyłem go na „Any CPU” i to załatwiło sprawę. Możesz zmienić tę wartość, wykonując następujące czynności:

kliknij prawym przyciskiem myszy projekt i przejdź do Properties -> Build -> Platform Target -> change to "Any CPU"


1
Próbowałem użyć 32-bitowego System.Data.SQLite.dll i otrzymałem ten wyjątek podczas pracy na 64-bitowym procesorze. Zmieniłem platformę docelową z „Any CPU” na „x86” i sprawiło, że wyjątek zniknął. Wydaje mi się, że jeśli nie chcesz zmaksymalizować wydajności, lepiej jest zbudować dla najmniej wspólnego mianownika, aby działał na 32- lub 64-bitowym procesorze.
cdavidyoung

3

Rozwiązałem to, co dziwne, instalując System.Data.SQLite za pośrednictwem aplikacji Nuget GUI, w przeciwieństwie do konsoli menedżera pakietów.

Instalacja za pośrednictwem konsoli nie obejmuje zależności, które ta biblioteka musi uruchomić.


3

System.Data.SQLitema zależność od System.Data.SQLite.interopupewnij się, że oba pakiety są w tej samej wersji i są x86 .

To stare pytanie, ale wypróbowałem wszystkie powyższe. Pracowałem nad projektem ściśle x86 , więc nie było dwóch folderów / x86, / x64. Ale z jakiegoś powodu System.Data.SQLitebyła to inna wersja niż System.Data.SQLite.interop, gdy ściągnąłem pasujące biblioteki DLL, problem został naprawiony.


1

Wymyśliłem 2 szybkie rozwiązania. Albo pracuj dla mnie. Myślę, że problem wynika z uprawnień.

1) Zamiast używać pliku Elmah.dll z katalogu net-2.0, użyłem Elmah.dll z net-1.1.

2) Zamiast przechowywać Elmah.dll w katalogu bin projektu. Tworzę katalog dll, aby go umieścić.


1

Innym sposobem obejścia tego problemu jest po prostu uaktualnienie aplikacji do ELMAH 1.2 zamiast 1.1.


0

Czy możesz usunąć folder bin debug i ponownie skompilować?

Lub sprawdź odniesienie projektu do System.Data.SQLitepliku, wyśledź, gdzie się znajduje, a następnie otwórz dll w reflektorze. Jeśli nie możesz go otworzyć, oznacza to, że dll jest uszkodzony, możesz znaleźć poprawną lub ponownie zainstalować framework .net.


Próbowałem bezpośrednio dodać odwołanie do System.Data.SQLite (oprócz usuwania bin i obj) i otrzymałem ten błąd: Błąd 1 Ostrzeżenie jako błąd: Generowanie zestawu - zestaw odniesienia 'System.Data.SQLite.dll 'jest skierowany na inny procesor
MyProject

0

Jeśli używasz IIS Express jako serwera WWW na swoim komputerze deweloperskim, zmieniłbym na Lokalne IIS. To zadziałało dla mnie.


0

To jest stary post, ale niektórym osobom szukającym informacji o tym błędzie może pomóc ustawienie opcji „Włącz aplikacje 32-bitowe” na wartość True dla puli aplikacji. To właśnie rozwiązało problem za mnie. Na to rozwiązanie natknąłem się, czytając komentarze do odpowiedzi @ beckelmw.


0

Prawdopodobnie masz zainstalowany zły pakiet. Potrzebujesz pakietu wyprodukowanego przez firmę Microsoft, który implementuje model dostawcy System.Data.Common.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.