Konnte Datei oder Assembly nicht laden ‚System.Data.SQLite‘
Frage
Ich habe installiert ELMAH 1.1 .Net 3.5 x64 in meinem ASP.NET-Projekt und jetzt diesen Fehler erhalte ich (wenn ich versuche, jede Seite zu sehen):
konnte nicht geladen werden Datei oder Assembly ‚System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' oder eine ihrer Abhängigkeiten. Ein Versuch wurde gemacht, ein Programm mit einem laden falsches Format.
Beschreibung: Nicht verarbeitete Ausnahme während die Ausführung des aktuellen Web Anfrage. Bitte überprüfen Sie die Stack-Trace Weitere Informationen über den Fehler und wo sie ihren Ursprung in dem Code.
Ausnahmedetails: System.BadImageFormatException: Könnte Datei oder Assembly nicht laden ‚System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' oder eine ihrer Abhängigkeiten. Ein Versuch wurde gemacht, ein Programm mit einem laden falsches Format.
Weitere Fehlerdetails an der Unterseite.
Meine aktive Lösungsplattform ist „Any CPU“ und ich bin auf einem x64 Windows 7 auf einem x64, natürlich Prozessor ausgeführt wird. Der Grund, warum wir diese Version von ELMAH verwenden ist, weil 1.0 .NET 3.5 (x86, die die einzige Plattform, für die sie kompiliert) hat uns den gleichen Fehler auf unserem x64-Windows-Server.
Ich habe versucht, für x86 und x64 kompilieren und ich bekomme den gleichen Fehler. Ich habe versucht, den alle Compiler Ausgabe (bin und obj) zu entfernen. Schließlich habe ich gemacht einen Verweis auf den SQLite dll direkt, etwas, das nicht für das Projekt benötigt wurde auf dem Server zu arbeiten, und ich habe diesen Compiler-Fehler bekommen:
1 Warnung Fehler als Fehler: Assembly Generation - referenzierte Assembly 'System.Data.SQLite.dll' Targets ein anderer Prozessor MyProject
Irgendwelche Ideen, was das Problem sein könnte?
Weitere Fehlerdetails:
Quellfehler:
Eine nicht behandelte Ausnahme erzeugt wurde während der Ausführung der aktuellen Web-Anfrage. Informationen über die Ursprung und die Position der Ausnahme werden kann, mit der Ausnahme identifiziert Stack-Trace.
Stack-Trace:
[BadImageFormatException: Könnte nicht Ladedatei oder Montage ‚System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' oder eine ihrer Abhängigkeiten. Ein Versuch wurde gemacht, ein Programm mit einem laden falsches Format.]
System.Reflection.Assembly._nLoad (Assembly filename, String codebase, Evidence assemblySecurity, Montage locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.nLoad (Assembly filename, String codebase, Evidence assemblySecurity, Montage locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad (Assembly AssemblyRef, Evidence assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assembly, Evidence assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) +142 System.Reflection.Assembly.Load (String assembly) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assembly, Boolean starDirective) +46[Configuration: Könnte Datei oder Assembly nicht laden ‚System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' oder eine ihrer Abhängigkeiten. Ein Versuch wurde gemacht, ein Programm mit einem laden falsches Format.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assembly, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +203 System.Web.Configuration.CompilationSection.LoadAssembly (Assembly 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): Könnte nicht Ladedatei oder Montage ‚System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' oder eine ihrer Abhängigkeiten. Ein Versuch wurde gemacht, ein Programm mit einem laden falsches Format.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironment.Initialize (Application AppManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) 729[Httpexception (0x80004005): Könnte nicht Ladedatei oder Montage ‚System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' oder eine ihrer Abhängigkeiten. Ein Versuch wurde gemacht, ein Programm mit einem laden falsches Format.]
System.Web.HttpRuntime.FirstRequestInit (Httpcontext Kontext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (Httpcontext Kontext) +85
System.Web.HttpRuntime.ProcessRequestInternal (Httpworkerrequest wr) +259
Lösung
System.Data.SQLite.dll
ist eine gemischte Anordnung, das heißt es sowohl verwalteten Code enthält und nativen Code. Daher ist eine besondere System.Data.SQLite.dll
entweder x86 oder x64, aber beide nie.
Update ( mit freundlicher Genehmigung von J. Pablo Fernandez ): Cassini, Server des Web-Entwicklung von Visual Studio verwendet, wenn Sie F5 drücken oder die grünen «Play» klicken, ist x86 nur was bedeutet, dass selbst wenn die Workstation x64 ist, können Sie nur in der Lage sein werden, die x86-Version von System.Data.SQLite.dll zu verwenden.
Eine Alternative ist nicht Cassini aber IIS7 zu verwenden, die richtig ist x64.
Andere Tipps
Stellen Sie sicher, dass "Enable 32 - Bit-Anwendungen." Auf false gesetzt ist für die App-Pool
zum IIS7 Application Pool -> advanced settings and set the 32-bit application to true
.
Dies ist sehr einfach, wenn Sie nicht SQLite verwenden:
Sie können den SQLite-DLLs von Ihrer Lösung Sind Ordner löschen, dann aus dem Ordner, in dem Sie ELMAH verweisen. Neu zu erstellen, und Ihre Anwendung wird nicht versuchen, diese DLL zu laden, die Sie nicht verwenden.
Ich habe eine 64-Bit-Dev-Maschine und 32-Bit-Build-Server. Ich habe diesen Code vor der NHibernate Initialisierung. Arbeitet mit Charme auf jede Architektur (auch die 2 habe ich getestet)
Hoffe, das hilft jemand.
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";
}
Als jemand, der mit ganz wenigen Bugreports auf Roadkill Wiki zu behandeln genau das gleiche Problem gehabt hat, ist es das, was Sie tun müssen:
- Sind Sie mit x64 oder x86? SQLite kommt mit DLLs für separate Architekturen - kopieren Sie die richtige zu Ihrem Ordner ist, gibt es zwei DLLs für den offiziellen Anbieter:
System.Data.SQLite.dll
System.Data.SQLite.Linq.dll
- Wenn Sie nicht auf die Jagd um für diese Baugruppen gestört werden können, ermöglichen 32-Bit-Modus für Ihre App-Pool (eine Lösung für Entwickler Maschinen nur in der Regel)
- Wenn Sie auf einem Server hosten, werden Sie das Microsoft C ++ Runtime verteilbare müssen - es ist nicht auf Server 2008 R2 standardmäßig installiert ist. x64-Version , x86-Version
Es ist eine echte Nervensäge, wie viele Reifen muss man durch springen, wenn die SQLite .NET-Binärdateien neu zu verteilen, meine Lösung für Roadkill war am Ende der richtigen Binärdateien in dem ~ / bin-Ordner auf der Basis zu kopieren Architektur Ihrer Verwendung. Leider, dass die C ++ Runtime-Problem nicht lösen.
ich beschlossen dies durch System.Data.SQLite mit Nuget Erweiterung installieren. Diese Erweiterung kann für Visual Studio 2010 oder höher. Zuerst müssen Sie Nuget Erweiterung installieren. Sie können hier wie folgt vor:
- Zur Visual Studio 2010, Menü -> Extras
- Wählen Sie Extension Manager
- Geben Sie NuGet in das Suchfeld ein und klicken Sie auf Online-Galerie. Warten sie Informationen abrufen ...
- Wählen Sie das NuGet Package Manager abgerufen werden, klicken Sie auf Download. Warten sie herunterladen ...
- Klicken Sie auf die Visual Manager Studio-Erweiterung Installer NuGet Paket installieren. Warten Sie, bis die Installation abgeschlossen.
- Klicken Sie auf Schließen und ‚Jetzt neu starten.
Zweitens, jetzt können Sie SQLite installieren:
- Gehen Sie in das Menü Tools-> Bibliothek Package Manager-> Package Manager-Konsole des Visual Studio.
- Führen Sie dann den Befehl Install-Package System.Data.SQLite in Package Manager-Konsole. So was: den Befehl ausführen Install-Package System.Data.SQLite in Package Manager-Konsole
Und jetzt können Sie System.Data.SQLite verwenden.
In diesem Fall sehen Sie zwei Ordner x64 und x86, diese Ordner enthalten SQLite.Interop.dll. Nun gehen Sie auf die Eigenschaften-Fenster dieser DLLs und setzen Build Aktion für Inhalt und kopieren Ausgabeverzeichnis kopieren immer.
So, das ist mein Weg.
Danke. Kim Tho Pham, Ho Chi Minh Stadt, Vietnam. E-Mail: tho.phamkim@gmail.com
Manuelle Beladung System.Data.SQLite Montage kann dieses Problem zu beheben.
Changed gatapia des Kodex wie folgt:
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";
}
Ich habe diesen Fehler, wenn unser Windows-Server von 32-Bit-OS zu 64 Bit umgewandelt wurde. Die Baugruppe, die den Fehler werfen wurde eingestellt in x86-Modus (dh 32-Modus) zu kompilieren. Ich schaltete es auf „Any CPU“, und das war der Trick. Sie können diesen Wert ändern, indem Sie wie folgt vor:
rechts auf das Projekt klicken Sie auf OK Properties -> Build -> Platform Target -> change to "Any CPU"
In unserem Fall hat nicht funktioniert, weil unsere Produktionsserver fehlt
Microsoft Visual C ++ 2010 SP1 Redistributable Package (x86)
Wir installiert es und alle funktionieren. Der Pool Anwendung muss Aktivieren 32-Bit-Anwendungen auf true gesetzt und Sie müssen die x86-Version der Bibliothek
ich beschlossen diese, seltsam genug, von System.Data.SQLite über die Nuget GUI-Anwendung installieren, in Bezug auf die Paket-Manager-Konsole gegenüber.
über die Konsole installieren sind nicht die Abhängigkeiten dieser Bibliothek muss ausgeführt werden.
Ich kam mit zwei schnellen Lösungen auf. Entweder für mich arbeiten. Ich denke, das Problem aufgrund von Berechtigungen ist.
1) Statt die Elmah.dll Datei aus dem Netz-2.0-Verzeichnis zu verwenden, habe ich Elmah.dll von Netz-1.1.
2) Anstelle von Elmah.dll im Projekt ist-Verzeichnis zu halten. Ich mache ein dll-Verzeichnis um es in.
Eine andere Möglichkeit, dies zu umgehen, ist nur Ihre Anwendung ELMAH 1.2 statt 1.1 zu aktualisieren.
System.Data.SQLite
hat eine Abhängigkeit von System.Data.SQLite.interop
sicherstellen, dass beide Pakete die gleiche Version und sind beide x86 .
Dies ist eine alte Frage, aber ich versuchte, alle oben. Ich arbeite an einem streng x86 Projekt, so dass es nicht zwei Ordner / x86, / x64. Aber aus irgendeinem Grund war die System.Data.SQLite
eine andere Version System.Data.SQLite.interop
, sobald ich nach unten gezogen passende dlls das Problem behoben wurde.
Können Sie Ihren sind Debug-Ordner löschen und neu zu kompilieren wieder?
Oder überprüfen Sie Ihre Projektverweis auf die System.Data.SQLite
, die Spur zu kommen, wo er sich befindet, öffnen Sie dann die DLL-Reflektor. Wenn Sie es nicht öffnen kann, bedeutet das, dass die dll beschädigt ist, könnte man eine richtige finden möchten oder .NET Framework installieren.
Wenn Sie IIS Express als Web-Server auf dem Entwicklungscomputer verwenden ich Local IIS ändern würde. Das funktionierte für mich.
Dies ist eine alte Post, aber es kann einige Leute zu diesem Fehler suchen Hilfe für den App-Pool auf True, um zu versuchen Einstellung „Enable 32-Bit-Anwendungen“. Das ist, was den Fehler für mich gelöst. Ich kam auf diese Lösung, indem er einige Bemerkungen zu @ beckelmw Antwort zu lesen.
Sie haben wahrscheinlich das falsche Paket installiert. Sie wollen das Paket produziert von Microsoft die die System.Data.Common implementiert Provider-Modell.