2009-08-14 68 views
115

Zainstalowałem program ELMAH 1.1 .Net 3.5 x64 w moim projekcie ASP.NET, a teraz otrzymuję 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"

Could not load file or assembly 'System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.BadImageFormatException: Could not load file or assembly 'System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Więcej szczegółowych informacji o błędach na dole.

Moja platforma Active Solution to "Dowolny procesor" i korzystam z x 64 systemu Windows 7 na procesorze x64. Powodem, dla którego używamy tej wersji ELMAH jest to, że 1.0 .Net 3.5 (x86, która jest jedyną platformą, dla której została skompilowana) dała nam ten sam błąd na naszym serwerze Windows x64.

Próbowałem kompilacji dla x86 i x64 i pojawia się ten sam błąd. Próbowałem usunąć wszystkie wyjście kompilatora (bin i obj). Wreszcie zrobiłem odniesienie do SQLite dll bezpośrednio, coś, co nie było potrzebne do realizacji projektu, aby pracować na serwerze i mam ten błąd kompilatora:

Error 1 Warning as Error: Assembly generation -- Referenced assembly 'System.Data.SQLite.dll' targets a different processor MyProject

jakieś pomysły co może być problem?

Więcej informacji o błędach:

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[BadImageFormatException: Could not load file or assembly 'System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.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, StackCrawlMark& stackMark, Boolean forIntrospection) +142 System.Reflection.Assembly.Load(String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: Could not load file or assembly 'System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
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 outputAssemblyName) +54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax() +52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +337

[HttpException (0x80004005): Could not load file or assembly 'System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
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): Could not load file or assembly 'System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +85
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +259

+0

Dziennik łączenia (wiążące wiązanie) jest znacznie bardziej przydatny w takich przypadkach niż ten arkusz śledzenia stosu. –

+1

Wygląda na to, że problem polega na tym, że Cassini to x86. – Pablo

+0

Miałem ten sam problem i musiałem zrezygnować z ELMAH z powodu mieszanego środowiska produkcyjnego/rozwojowego, jakie mamy. Biorąc pod uwagę, że używanie SQLite na serwerze produkcyjnym o dużym natężeniu ruchu nie brzmi zbyt dobrze i fakt, że SQLite dll jest jedynym zestawem w ELMAH, który zmusza go do posiadania dwóch różnych wersji dla bitów x86 i 64x, zastanawiam się dlaczego faceci ELMAH ciągną to i sprawiają, że opcjonalne, a nie to, co jest teraz. – Khash

Odpowiedz

113

System.Data.SQLite.dll jest zespołem mieszanym, tzn. Zawiera zarówno kod zarządzany, jak i kod natywny. Dlatego konkretna System.Data.SQLite.dll jest albo x86 lub x64, ale nigdy obie.

Update (uprzejmości J. Pablo Fernandez): Cassini, serwer Web Development wykorzystywane przez Visual Studio po naciśnięciu klawisza F5 lub kliknij zielony przycisk «» luz, to tylko x86, co oznacza, że ​​nawet jeśli stacja robocza jest x64, będziesz mógł korzystać tylko z wersji System.Data.SQLite.dll w wersji x86.

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

+3

Używam wersji x64 na komputerze x64. – Pablo

+0

Czy próbowałeś używać wersji x86? –

+2

Tak, ale jak rozwiązać problem? – roydukkey

0

można usunąć folder bin debugowania i skompilować ponownie?

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

+0

Próbowałem dodać bezpośrednie odniesienie do System.Data.SQLite (oprócz usuwania bin i obj) i mam ten błąd: Błąd Ostrzeżenie jako błąd: Generowanie złożenia - Zestaw odniesienia "System.Data. SQLite.dll 'celuje w inny procesor MyProject – Pablo

73

Upewnij się, że "Włącz aplikacje 32-bitowe" ma wartość false dla puli aplikacji.

+2

Działa to, jeśli chcesz użyć biblioteki dll x86 na komputerze 64-bitowym. W naszym przypadku nasze środowiska programistyczne i produkcyjne nie są zgodne, więc to było najlepsze. – Rob

+1

Zrobiłem to dla mnie, dzięki. – Jirapong

+16

Ustawienie tak dla mnie rzeczywiście rozwiązało problem. Domyślam się, że Elmah jest domyślnie dostarczana z 32-bitowym zestawem sql lite. –

7

Mam 64-bitową maszynę programistyczną i serwer 32-bitowy. Użyłem tego kodu przed inicjalizacją NHibernate. Działa uroku na każdej architekturze (dobrze 2 testowałem)

Mam nadzieję, że to pomaga komuś.

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"; 
     } 
+0

Czy ktoś z powodzeniem stosuje tę technikę? Próbowałem go w testowym rozwiązaniu app mvc asp.net i nie działało to dla mnie. – Glenn

+1

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

+2

Lub właściwości [Environment.Is64BitProcess] (http://msdn.microsoft.com/en-us/library/system.environment.is64bitprocess.aspx) (od .NET4). – riezebosch

41

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

+0

Używam systemu Windows 7 i trafiłem na ten problem; zamieniając 32-bitowe na naprawiono to dla mnie, prawdopodobnie dlatego, że moja kopia DLL'a była 32-bitowa. – Doug

+1

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

+0

I upewnij się, że masz wersję Win32 SQLite.Interop.dll http://stackoverflow.com/questions/4816529/corflags -exe-system-data-sqlite-dll-and-badimageformatexception/4839285 –

3

Ten błąd wystąpił, gdy nasz serwer Windows został przekonwertowany z 32-bitowego systemu operacyjnego na 64-bitowy. Zestaw, który wyrzucał błąd, został skompilowany w trybie x86 (tj. Tryb 32). Zmieniłem go na "Any CPU" i to wystarczyło.Można zmienić tę wartość w następujący sposób:

prawym przyciskiem myszy na projekcie pójść do Properties -> Build -> Platform Target -> change to "Any CPU"

+1

Próbowałem użyć 32-bitowego pliku System.Data.SQLite.dll i uzyskać ten wyjątek podczas uruchamiania 64-bitowego procesora. Zmieniłem docelową platformę z "Any CPU" na "x86", co spowodowało, że wyjątek zniknął. Rozumiem, chyba że chcesz zmaksymalizować wydajność, lepiej jest budować dla najmniej wspólnego mianownika, aby działał na procesorze 32- lub 64-bitowym. – cdavidyoung

3

obciążenia związane z ręcznym montażem System.Data.SQLite może rozwiązać ten problem.

Zmiany wprowadzona gatapia Kodeks 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"; 
    } 
1

wymyśliłem 2 szybkich rozwiązań. 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. Robię katalog dll, aby umieścić go w

11

To jest bardzo proste, jeśli nie używasz SQLite.

można usunąć SQLite DLL z odbiornika foldery swoje rozwiązanie, a następnie z folderu, w którym odwoływać ELMAH. Przebuduj, a Twoja aplikacja nie spróbuje załadować tej biblioteki DLL, z której nie korzystasz.

+4

+1 Jeśli nie używasz SQLite, to po co zawracać sobie głowę przywoływaną biblioteką DLL? Ładnie, elegancko i dokładnie to, czego potrzebowałem. – bhavinb

+2

ostateczne rozwiązanie ... – pqsk

+0

To działało lokalnie, ale dostałem błąd po wdrożeniu na platformie Azure. – stuartdotnet

1

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

2

W naszym przypadku nie działa, ponieważ nasz serwer produkcyjny brakuje

Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)

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

+0

Działa dla mnie. Po prostu wyświetla komunikat o błędzie bez wskazywania, że ​​brakuje biblioteki C, co jest okropne. – brk

4

Jako ktoś, kto miał do czynienia z kilkoma raportami błędów na Roadkill Wiki z dokładnie tym samym problemem, to właśnie to musisz wykonać:

  • Czy używasz x64 lub x86? Sqlite jest dostarczany z bibliotekami DLL dla oddzielnych architektur - skopiuj prawy do folderu bin, istnieją dwa DLLS dla oficjalnego dostawcy: System.Data.SQLite.dllSystem.Data.SQLite.Linq.dll
  • Jeśli nie możesz zawracać sobie głowy polowaniem na te zespoły, włącz tryb 32-bitowy Pula aplikacji (zazwyczaj jest to zwykle rozwiązanie dla urządzeń deweloperskich)
  • Jeśli hostujesz na serwerze, potrzebujesz redystrybucji Microsoft C++ Runtime - nie jest domyślnie instalowany na serwerze 2008 R2. x64 version, x86 version

to prawdziwy wrzód na dupie, jak wiele obręcze trzeba przeskoczyć, gdy ponownie dystrybucji plików binarnych SQLite .NET, moje rozwiązanie dla Roadkill w końcu było skopiować odpowiednie pliki binarne do ~/bin folder na podstawie architektury, z której korzystasz. Niestety to nie rozwiązuje problemu środowiska wykonawczego C++.

0

Jeśli używasz usług IIS Express jako serwera WWW na maszynie programistycznej, chciałbym zmienić na Local IIS. To działało dla mnie.

2

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

Instalacja za pomocą konsoli nie zawiera zależności, które biblioteka musi uruchomić.

3

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

  • idź do Visual Studio 2010, Menu -> Narzędzia
  • Wybierz Extension Manager
  • Wpisz Nuget w polu wyszukiwania i kliknij internetowej galerii. Oczekiwanie Na pobranie informacji ...
  • Wybierz pobrany menedżer pakietów NuGet, kliknij Pobierz. Czekam na pobranie ...
  • Kliknij opcję Zainstaluj w Menedżerze pakietów rozszerzeń programu Visual Studio NuGet. Poczekaj na zakończenie instalacji.
  • Kliknij Zamknij i "Uruchom ponownie teraz.

drugie, teraz można zainstalować SQLite:

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

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

Tak, to jest moja droga.

Dzięki. Kim Tho Pham, HoChiMinh City, Wietnam. Email: [email protected]

+0

dziękuję za udostępnienie – Drew

0

System.Data.SQLite ma uzależnienia od System.Data.SQLite.interop upewnić oba pakiety są takie same i są zarówno w wersji x86 .

To jest stare pytanie, ale próbowałem wszystkich powyższych. Pracowałem nad projektem ściśle: x86, więc nie było dwóch folderów/x86,/x64. Ale z jakiegoś powodu, System.Data.SQLite była inna wersja niż System.Data.SQLite.interop, po ściągnięciu pasujących bibliotek dll problem został naprawiony.

Powiązane problemy