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

pupeno
źródło
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.

Anton Tykhyy
źródło
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.

beckelmw
źródło
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.

umar
źródło
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.

Chris
źródło
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";
        }
gatapia
źródło
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

Marcos Meli
źródło
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 ++.

Chris S.
źródło
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: [email protected]

Kim Thọ Phạm
źródło
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";
    }
lxwwqw
źródło
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"

goku_da_master
źródło
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ć.

JMK
źródło
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.

Stacker-flow
źródło
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ć.

Zaraz
źródło
1

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

Peter Bernier
źródło
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.

Graviton
źródło
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.

cyclo_magic
źródło
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.

Michael D.
źródło
0

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

pimbrouwers
źródło