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

War es hilfreich?

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

Gehen Sie

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:

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top