In regelmäßigen Abständen erhalte ich die folgende Ausnahme:
Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Ich benutze 1.0.82.0. Version, Installation mit Nuget in VS2010, OS Win7 64.
Sobald eine Ausnahme auftritt, wird sie ständig angezeigt - beim Debuggen und Freigeben und Ausführen von Anwendungen innerhalb oder außerhalb von VS.
Die einzige Möglichkeit, dies zu stoppen, ist das Abmelden und Anmelden. Die Ausnahme wird nicht ausgelöst und die DLL wird geladen. Es kann tagelang funktionieren, aber dann kann es wieder brechen.
Hat jemand so etwas gesehen und gibt es eine Lösung dafür?
Antworten:
Ich weiß, dass ich zu spät zur Party komme, aber ich hatte dieses Problem direkt nachdem ich heute das neueste x86 / x64 heruntergezogen hatte (Version 1.0.88.0). Mein lokaler IIS in VS2012 läuft standardmäßig mit 32 Bit und es gibt keine einfache Möglichkeit, zu x64 zu wechseln. Mein Produktionsserver läuft 64bit.
Wie auch immer, ich habe das NuGet-Paket in einem DLL-Projekt installiert und diesen Fehler erhalten. Was ich tun musste, um es zum Laufen zu bringen, musste ich auch im Hauptprojekt installieren . Auch wenn es SQLite-Klassen überhaupt nicht berührt.
Ich vermute, dass SQLite die Eintragsassembly verwendet, um zu ermitteln, welche Version von Interop geladen werden soll.
quelle
Ich hatte dieses Problem, weil eine von mir verwendete DLL Sqlite als Abhängigkeit hatte (in NuGet nur mit dem Sqlite-Kernpaket konfiguriert). Das Projekt kompiliert und kopiert alle SQLite-DLLs mit Ausnahme der Datei 'SQLite.Interop.dll' (Ordner x86 und x64).
Die Lösung war sehr einfach: Fügen Sie einfach das Sqlite.Core-Paket als Abhängigkeit (mit NuGet) zu dem Projekt hinzu, das Sie erstellen / ausführen, und die DLLs werden kopiert.
quelle
Ich hatte das gleiche Problem bei der Verwendung von SQLite in einem WPF-Projekt, dessen Plattformziel war
Any CPU
. Ich habe es behoben, indem ich die folgenden Schritte ausgeführt habe:prefer 32-bit
Option.Alternativ können Sie das Plattformziel auch auf
x86
oder setzenx64
. Ich denke, dieses Problem wird durch dieSystem.Data.SQLite
Bibliothek verursacht, die das Plattformziel verwendet, um den Speicherort der Datei 'SQLite.Interop.dll' abzurufen.AKTUALISIEREN:
Falls der Projektdesigner nicht erreichbar ist, öffnen Sie einfach die project (
*.csproj
) - Datei in einem Texteditor und fügen Sie den Wert<Prefer32Bit>false</Prefer32Bit>
dem<PropertyGroup>...</PropertyGroup>
Tag hinzu.Beispielcode
quelle
.csproj
ausgegraut . Die Datei hatte esfalse
bereits eingestellt, hatte aber immer noch den Fehler.So habe ich es in meinem Projekt behoben.
Es hat funktioniert, und als ein Kollege seine Änderungen übermittelte, erhielt ich die Ausnahme "DLL 'SQLite.Interop.dll' kann nicht geladen werden".
Anders als in der .csproj-Datei des Projekts war dies in der NON-WORKING-Version:
Und das hatte die WORKING-Version:
Nach dem Zurückkehren habe ich die Ausnahme nicht erhalten. Die DLL-Dateien wurden in den entsprechenden Debug \ x64 (etc) -Ordnern gespeichert.
quelle
Nach dem Hinzufügen von NuGet kopiert die Bereitstellung die Interops nicht. Sie können dies zu Ihrer csproj-Datei hinzufügen und es sollte dieses Verhalten beheben:
Wenn Sie in der Quelle nach NuGet for SQLite suchen, können Sie sehen, was diese speziell tun. Dadurch konnte ich eine Bereitstellung mit ASP.Net Core ausführen.
quelle
Wenn Sie in diesem Zustand sind, versuchen Sie, ein Rebuild-All durchzuführen. Wenn dies das Problem behebt, haben Sie möglicherweise das gleiche Problem wie ich.
Einige Hintergrundinformationen (mein Verständnis) :
SQLite verfügt über 1 verwaltete Assembly (System.Data.SQLite.dll) und mehrere plattformspezifische Assemblys (SQLite.Interop.dll). Bei der Installation von SQLite mit Nuget fügt Nuget Ihrem Projekt die plattformspezifischen Assemblys hinzu (in mehreren Ordnern: \ x86, \ x64) und konfiguriert diese DLLs auf "Immer kopieren".
Beim Laden sucht die verwaltete Assembly nach plattformspezifischen Assemblys in den Ordnern \ x86 und \ x64. Mehr dazu sehen Sie hier . Die Ausnahme ist, dass diese verwaltete Assembly versucht, die relevante (SQLite.Interop.dll) in diesen Ordnern zu finden (und fehlschlägt).
Mein Szenario :
Ich habe 2 Projekte in meiner Lösung; eine WPF-App und eine Klassenbibliothek. Die WPF-App verweist auf die Klassenbibliothek, und die Klassenbibliothek verweist auf SQLite (über Nuget installiert).
Das Problem für mich war, wenn ich nur die WPF-App ändere, VS versucht, eine teilweise Neuerstellung durchzuführen (wobei festgestellt wird, dass sich die abhängige DLL nicht geändert hat). Irgendwo in diesem Prozess bereinigt VS den Inhalt der Ordner \ x86 und \ x64 (SQLite.Interop.dll wird weggeblasen). Wenn ich einen vollständigen Neuaufbau durchführe, kopiert VS die Ordner und ihren Inhalt korrekt.
Meine Lösung :
Um dies zu beheben, habe ich schließlich einen Post-Build-Prozess mit xcopy hinzugefügt, um das Kopieren der Ordner \ x86 und \ x64 aus der Klassenbibliothek in mein WPF-Projektverzeichnis \ bin zu erzwingen.
Alternativ können Sie mit den Build-Konfigurations- / Ausgabeverzeichnissen ausgefallenere Dinge tun.
quelle
Ich hatte das gleiche Problem mit Visual Studio Express 2013. Ich habe mehrere hier und anderswo erwähnte Lösungen ohne Erfolg ausprobiert. Ich hoffe, dieses Update hilft anderen.
Ich habe das Problem mithilfe des
DeploymentItem
Attributs in meiner Testklasse behoben, mit dem der SQLite-basierte Dienst getestet wird.Beispiel:
Dies führt dazu
SQLite.Interop.dll
, dass die erforderlichenx86
Daten in das Verzeichnis im entsprechenden Ordner "TestResults" kopiert werden .Alles ist grün. Alles ist gut.
quelle
Das Aktualisieren von NuGet von
Tools -> Extension and updates
und das Neuinstallieren von SQLite.Core mit dem Befehl habenPM> Update-Package -reinstall System.Data.SQLite.Core
es für mich behoben.quelle
Ich hatte ein ähnliches Problem in einer Lösung mit mehreren Projekten. Die SQLite.Interop.dll war für eines der Plugins erforderlich, die mit ClickOnce mit der Software verteilt wurden.
Beim Debuggen in Visual Studio funktionierte alles einwandfrei, aber in der bereitgestellten Version fehlten die Ordner x86 / und x64 /, die diese DLL enthielten.
Die Lösung, damit es nach der Bereitstellung mit ClickOnce funktioniert, bestand darin, im Startprojekt der Lösung (auch des veröffentlichten) diese beiden Unterordner zu erstellen, die DLLs in sie zu kopieren und sie als Inhaltskopie immer festzulegen.
Auf diese Weise nimmt das ClickOnce-Veröffentlichungstool diese Dateien und Ordner automatisch in das Manifest auf und stellt die Software mit ihnen bereit
quelle
Hier gibt es wirklich viele Antworten, aber meine ist einfach und klar, da kein GAC herumgespielt wird .
Das Problem war, dass die ausführbare Datei eine Kopie des Rechts
SQLite.Interop.dll
(x86 oder x64) benötigt, um auf unsere Datenbank zugreifen zu können.Meistens haben Architekturen Schichten, und in meinem Fall verfügt die Datenschicht über die erforderliche DLL für SQLite Connection.
Also habe ich einfach ein Post-Build-Skript in meine Datenschichtlösung eingefügt und alles hat gut funktioniert.
TL; DR;
Stellen Sie alle Projekte Ihrer Lösung auf
x86
oderx64
in den Erstellungsoptionen ein.Fügen Sie
Post-Build-Script
dem Projekt Folgendes hinzu mitSQLite nuget Package
:xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y
Natürlich müssen Sie das Skript für
Release Build
undx86
Builds ändern .STL; DR;
Stellen Sie Ihre
SQLite.Interop.dll
neben die*.exe
Datei.quelle
Die Standardinstallation der SQLite-Version mit mehreren Architekturen (x86, x64) von NuGet weist das von Ihnen beschriebene Verhalten auf. Wenn Sie die richtige Version für die tatsächliche Architektur laden möchten, die die .NET-Laufzeit zum Ausführen Ihrer Anwendung auf Ihrem Computer ausgewählt hat, können Sie dem DLL-Loader wie folgt einen Hinweis geben, wo sich die richtige Bibliothek befindet:
Fügen Sie vor Ihrem Program.Main () eine Deklaration für den Funktionsaufruf kernel32.dll zu SetDLLDirectory () hinzu:
Verwenden Sie dann Ihre eigene Methode, um das richtige Unterverzeichnis zu ermitteln und die architekturspezifische Version von 'SQLite.Interop.dll' zu finden. Ich benutze den folgenden Code:
quelle
Auch wenn es sich um einen alten Beitrag handelt, möchte ich die Lösung, die ich hier gefunden habe, weitergeben: http://system.data.sqlite.org/index.html/info/54e52d4c6f
Wenn Sie nicht das gesamte Problem lesen möchten, besteht die Lösung darin, die Datei "msvcr100.dll" (die sich im Verzeichnis Windows \ System32 befindet) in denselben Pfad wie SQLite.Interop.dll zu kopieren.
Ich würde empfehlen, das Problem zu lesen, um zu verstehen, warum und um die Datei in Ihr Setup aufzunehmen. Um sie jedoch nur zu installieren, wenn der Fehler auftritt, habe ich sie zu einer optionalen Komponente gemacht, die in den Setup-Optionen ausgewählt werden kann.
HTH, Formentz
quelle
Wie im SQLite-Wiki angegeben , muss Ihre Anwendungsbereitstellung wie folgt sein:
Sie müssen also die Regeln befolgen. Finden Sie eine DLL, die zu Ihrer Zielplattform passt, und platzieren Sie sie an einem Ort, wie im Bild beschrieben. DLLs finden Sie in YourSolution / packages / System.Data.SQLite.Core.% Version% /.
Ich hatte Probleme mit der Anwendungsbereitstellung, daher habe ich meinem Projekt die richtige SQLite.Interop.dll hinzugefügt, den App86-Ordner im Setup-Projekt um den x86-Ordner erweitert und Dateiverweise zur DLL hinzugefügt.
quelle
Sie können diesen Fehler auch erhalten, wenn Sie versuchen, eine 32-Bit-DLL in einem 64-Bit-Projekt auszuführen.
Ich habe dies erhalten, wenn ich dieselbe Datei (SQLite.Interop.dll in 32-Bit-Version) sowohl im x86- als auch im x64-Ordner abgelegt habe.
quelle
Wenn Sie die richtige Binärdatei für herunterladen,
SQLite
kopierenSQLite.Interop.dll
Sie sie entsprechend Ihrer Projekterstellungsoption in Ihren Release- oder Debug- Ordner.quelle
Ich weiß nicht, warum dies noch nicht aufgenommen wurde, aber ich musste die Nachforschungen anstellen und es selbst herausfinden, also wird hoffentlich jemand diese Antwort finden und die Mühe sparen. Dies war für eine WPF-App. Es funktionierte gut auf meiner Dev-Box, aber nicht auf dem Computer, auf dem ich es kopierte und den
Unable to load DLL 'SQLite.Interop.dll'
Fehler bekam . Ich habe alle zugehörigen Verzeichnisse und Dateien direkt von meinem "Debug" -Ordner auf diesen anderen Computer portiert, als ich den gleichen Fehler wie das OP beim Ausführen bekam. Mein "bin" -Ordner, der meine DLLs enthielt, wurde nach "Debug \ bin" kopiert und alle wurden zusammen mit meinen Anwendungsdateien eingeschlossen, als ich über diesen Pfad auf den anderen Computer kopierte, sodass keine Dateien fehlten.Dinge, die ich in anderen Antworten gesehen habe, die nicht zutrafen:
Was ich gefunden habe, war Folgendes von https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :
Betonen Sie meine auf diesen fettgedruckten Teil innerhalb des Absatzes. Der Zielcomputer war frisch und hatte keine Programme außer .NET 4.0 geladen. Nachdem ich C ++ installiert hatte, konnte es die Befehle für SQLite ausführen. Dies hätte eine der ersten FAQs und Teil der Voraussetzungen sein sollen, wurde aber auf Platz 11 begraben. Mein Entwicklungscomputer hatte es bereits geladen, weil es mit Visual Studio geliefert wurde. Deshalb hat es dort funktioniert.
Download:
Visual C ++ Redistributable für Visual Studio 2015:
https://www.microsoft.com/en-us/download/details.aspx?id=48145
Update 3 (kumulatives Update):
https://www.microsoft.com/en-us/download/details.aspx?id=53587
quelle
Ich habe begonnen, Costura.Fody zu verwenden, um Assemblys (.net) zu verpacken und native DLLs einzubetten und vorzuladen. Dies hilft auch später bei der Verteilung, da Sie eine Datei senden können.
Installieren Sie Costura Fody von Nuget.
Erstellen Sie in Ihrem C # -Projekt einen Ordner mit dem Namen costrua32. Fügen Sie dort alle nativen DLLs hinzu, die Sie mit C # laden möchten.
Sobald Sie sie diesem Ordner hinzugefügt haben. Klicken Sie auf das Eigenschaftenfenster und ändern Sie die Build-Aktion in "Eingebettete Ressource".
Schließlich müssen Sie die XML-Datei mit dem Namen FodyWeavers.xml wie folgt ändern. Hier gebe ich an, zuerst die SQL-DLL zu laden. (Beachten Sie, dass Sie die DLL löschen)
Dies hat den Vorteil, dass Sie keine Ereignisse vor oder nach dem Build schreiben müssen und das Endprodukt vollständig in eine größere Datei eingekapselt ist.
quelle
Außerdem wurde die DLL zum Testprojekt hinzugefügt (über Nuget Manager) und behoben.
quelle
Ich hatte dieses Problem, weil Visual C ++ 2010 Redistributable nicht auf meinem PC installiert war. Wenn Sie Visual C ++ 2010 Redistributable noch nicht installiert haben, laden Sie es herunter und installieren Sie es (überprüfen Sie die x86- oder 64-DLL).
quelle
Ich habe das gleiche Problem. Endlich kann ich es jedoch beheben. Derzeit verwende ich Visual Studio 2013 Community Edition. Ich verwende einfach Add-> Existing Item ... und navigiere zu den SQLite.Data.SQLite-Dateien (mein Fall ist 'C: \ Programme (x86) \ System.Data.SQLite \ 2013 \ bin'). Bitte vergessen Sie nicht, den Typ Ihrer Aufnahme in Assembly-Dateien (* .dll; * .pdb) zu ändern . Wählen Sie in diesem Ordner ' SQLite.Interop.dll '. Von dort und dann kann ich ohne Probleme weitermachen. Viel glück, euch allen. ^ _ ^ PS Ich erstelle eine Webformularanwendung. Ich habe es noch nicht in Windows Form Application oder anderen versucht.
quelle
Versuchen Sie, das Plattformziel vor dem Erstellen auf x86 oder x64 (und nicht auf eine beliebige CPU) festzulegen: Projekt-> Eigenschaften-> Erstellen-> Plattformziel in Visual Studio.
quelle
Kopieren Sie SQLite.Interop.dll in das Projektverzeichnis.
quelle
Ich habe lange damit zu kämpfen gehabt und gelegentlich festgestellt, dass die Testeinstellung falsch ist. Siehe dieses Bild:
Ich deaktiviere einfach die Testeinstellung und das Problem verschwindet. Andernfalls tritt die Ausnahme auf. Hoffentlich hilft das jemandem. Ich bin mir nicht sicher, ob es die Grundursache ist.
quelle
Kopieren Sie die Dateien "SQLite.Interop.dll" für x86 und x64 in den Debug-Ordner. Diese Dateien sollten in die Ordner "x86" und "x64" im Debug-Ordner kopiert werden.
quelle
Meine Anwendung ist eine Webanwendung (ASP.NET MVC) und ich musste den Anwendungspool ändern, unter dem ausgeführt
LocalSystem
werden sollApplicationPoolIdentity
. Um dies zu tun:LocalSystem
Ich habe keine Ahnung, warum dies das Problem behebt.
quelle
Ich weiß nicht, ob es eine gute Antwort ist, aber ich konnte dieses Problem lösen, indem ich meine Anwendung unter einer AppDomain mit der Identität "Lokales System" ausführte.
quelle
Ich arbeite an einer einfachen Konsolenanwendung, um einer SQLite-Datenbank einige Testdaten hinzuzufügen, und habe diesen Fehler erhalten. Die Konfiguration für das Projekt lautet "Beliebige CPU". Ich habe es behoben, indem ich die Datei SQLite.Interop.dll in den Ordner bin \ debug kopiert habe. Ein besserer Weg wäre, die Methode von @Wil zu verwenden, aber wie geben Sie dies für die Konfiguration "Beliebige CPU" an?
quelle
Könnte es Streit um die Versammlung geben? Überprüfen Sie, ob die DLL eine andere Anwendung mit einer Dateisperre enthält.
Wenn dies der Grund ist, sollte es einfach sein, ein Tool wie den Process Explorer von Sysinternal zu verwenden, um das fehlerhafte Programm zu ermitteln.
HTH, Clay
quelle
Als Referenz für alle, die sich diese Frage ansehen:
Wenn Sie das Nuget-Paket verwenden, wird eine Build-Regel installiert, die das Kopieren für Sie übernimmt. (Siehe unter System.Data.SQLite.Core.1.0.94.0 \ build - oder welche Version von Core Sie auch installieren).
Das Nuget-Installationsprogramm fügt die Regel automatisch Ihrer Projektdatei hinzu.
Dies behebt das Testfallproblem jedoch immer noch nicht. Der DeploymentItem- Ansatz ( https://stackoverflow.com/a/24411049/89584 ) ist das einzige, was dort zu funktionieren scheint.
quelle
Ich bin auf dieses Problem in einer Lösung mit einem WebAPI / MVC5-Webprojekt und einem Feature-Test-Projekt gestoßen, die beide aus demselben Datenzugriffsprojekt (oder 'Kern'-Projekt) stammten. Ich verwende, wie so viele andere hier, eine Kopie, die über NuGet in Visual Studio 2013 heruntergeladen wurde.
In Visual Studio wurde dem Funktionstest und den Webprojekten ein x86- und x64-Lösungsordner hinzugefügt. Ich habe dann eine erstellt
Right Click | Add Existing Item...
und die entsprechende SQLite.interop.dll-Bibliothek..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]
für jeden dieser Ordner hinzugefügt . Ich habe dann einRight Click | Properties
, und SatzCopy to Output Directory
zuAlways Copy
. Wenn ich das nächste Mal meine Funktionstests ausführen musste, wurden die Tests erfolgreich ausgeführt.quelle