Ich habe eine DLL-Bibliothek mit nicht verwaltetem C ++ - API-Code, die ich in meiner .NET 4.0-Anwendung verwenden muss. Aber bei jeder Methode, mit der ich versuche, meine DLL zu laden, wird eine Fehlermeldung angezeigt:
DLL 'MyOwn.dll' kann nicht geladen werden: Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E)
Ich habe mehrere Lösungen gelesen und ausprobiert, die ich im Internet gefunden habe. Nichts funktioniert..
Ich habe versucht, folgende Methoden zu verwenden:
[DllImport("MyOwn.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
Wenn ich versucht habe, diesem Artikel zu folgen, und wenn ich dieses Beispiel (aus dem heruntergeladenen Code) ausführe, läuft es ohne Probleme (die verwendete DLL befindet sich im Ordner bin / debug).
Ich habe meine DLL kopiert (zusammen mit allen Dateien, von denen es abhängt, in meinen bin-Ordner).
Ich habe auch diesen Ansatz ausprobiert, aber den gleichen Fehler erhalten:
[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int MyproIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
Irgendwelche Vorschläge?
Mit dem Dumpbin-Tool können Sie die erforderlichen DLL-Abhängigkeiten ermitteln:
Hier erfahren Sie, welche DLLs Ihre DLL laden muss. Achten Sie besonders auf MSVCR * .dll. Ich habe gesehen, dass Ihr Fehlercode auftritt, wenn die richtige Visual C ++ Redistributable nicht installiert ist.
Sie können die "Visual C ++ Redistributable Packages for Visual Studio 2013" von der Microsoft-Website herunterladen. Es installiert c: \ windows \ system32 \ MSVCR120.dll
Im Dateinamen ist 120 = 12.0 = Visual Studio 2013.
Stellen Sie sicher, dass Sie die richtige Visual Studio-Version (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013 ...) für die Zielplattform Ihrer DLL (x64 oder x86) haben, und Sie müssen auch vorsichtig sein Debug-Builds. Der Debug-Build einer DLL hängt von MSVCR120d.dll ab, einer Debug-Version der Bibliothek, die mit Visual Studio installiert wird, jedoch nicht vom Redistributable Package.
quelle
debug
, muss die C ++ - Laufzeit-Redistributables-Version genau so sein, wie Sie sie erstellt haben , wenn Sie Binärdateien verwenden.Dies ist ein "Kludge", aber Sie könnten ihn zumindest zum Testen der Integrität verwenden: Versuchen Sie, den Pfad zur DLL in Ihrem Code fest zu codieren
Nachdem ich das gesagt habe; In meinem Fall wurde dieses Problem für mich gelöst
dumpbin /DEPENDENTS
, indem ich wie von @ anthony-hayward vorgeschlagen lief und über 32-Bit- Versionen der dort aufgeführten DLLs in mein Arbeitsverzeichnis kopierte .Die Nachricht ist nur ein bisschen irreführend, da nicht "meine" DLL geladen werden kann - es sind die Abhängigkeiten
quelle
Die DLL muss sich im Ordner bin befinden.
In Visual Studio füge ich die DLL meinem Projekt hinzu (NICHT in Referenzen, sondern "Vorhandene Datei hinzufügen"). Setzen Sie dann die Eigenschaft "In Ausgabeverzeichnis kopieren" für die DLL auf "Kopieren, wenn neuer".
quelle
Versuchen Sie, den vollständigen Pfad der DLL einzugeben. Wenn es nicht funktioniert, versuchen Sie, die DLL in den Ordner system32 zu kopieren.
quelle
Stellen Sie sicher, dass alle Abhängigkeiten Ihrer eigenen DLL in der Nähe der DLL oder in vorhanden sind
System32
.quelle
Es gibt eine sehr lustige Sache (und hat eine technische Relevanz), die Ihre Stunden verschwenden könnte. Denken Sie also daran, sie hier zu teilen -
Ich habe ein Konsolenanwendungsprojekt
ConsoleApplication1
und ein Klassenbibliotheksprojekt erstelltClassLibrary1
.Der gesamte Code, der den p / invoke ausführte, war in vorhanden
ClassLibrary1.dll
. Bevor ich die Anwendung aus Visual Studio debuggte, kopierte ich einfach die nicht verwaltete C ++ - Assembly (myUnmanagedFunctions.dll
) in das\bin\debug\
Verzeichnis desClassLibrary1
Projekts, damit sie zur Laufzeit von der CLR geladen werden kann.Ich bekam immer das
Fehler für Stunden. Später wurde mir klar, dass alle nicht verwalteten Assemblys, die geladen werden sollen, in das
\bin\debug
Verzeichnis des Startprojekts kopiert werden müssen, beiConsoleApplication1
dem es sich normalerweise um eine Win-Form, eine Konsole oder eine Webanwendung handelt.Seien Sie also bitte vorsichtig, dass
Current Directory
in der akzeptierten Antwort tatsächlich dieCurrent Directory
ausführbare Hauptdatei angegeben ist, von der aus Ihr Bewerbungsprozess beginnt. Sieht nach einer offensichtlichen Sache aus, ist aber manchmal nicht so.Lesson Learned - Platzieren Sie die nicht verwalteten DLLs immer im selben Verzeichnis wie die ausführbare Startdatei, um sicherzustellen, dass sie gefunden werden können.
quelle
bin\Debug
und hinzuzufügen,obj\Debug
und ich erhalte immer wieder dieAktivieren Sie die Fusionsprotokollierung. In dieser Frage finden Sie viele Ratschläge dazu. Das Debuggen von Problemen beim Laden von Apps im gemischten Modus kann ein wahrer königlicher Schmerz sein. Die Fusionsprotokollierung kann eine große Hilfe sein.
quelle
Stellen Sie sicher, dass Sie das Build Platform Target auf x86 oder x64 festlegen, damit es mit Ihrer DLL kompatibel ist, die möglicherweise für eine 32-Bit-Plattform kompiliert wurde.
quelle
Wenn sich die DLL- und die .NET-Projekte in derselben Lösung befinden und Sie beide jedes Mal kompilieren und ausführen möchten, können Sie mit der rechten Maustaste auf die Eigenschaften des .NET-Projekts "Ereignisse erstellen" klicken und dem Ereignis "Nach dem Erstellen" Folgendes hinzufügen Befehlszeile:
Es handelt sich im Grunde genommen um eine DOS-Zeile, und Sie können die Einstellungen basierend darauf vornehmen, wohin Ihre DLL erstellt wird.
quelle
Ich hatte das gleiche Problem, als ich meine Anwendung zum Testen des PCs bereitstellte. Das Problem war der Entwicklungs-PC
msvcp110d.dll
undmsvcr110d.dll
nicht der Test-PC.Ich habe das Zusammenführungsmodul "Visual Studio C ++ 11.0 DebugCRT (x86)" in InstalledSheild hinzugefügt und es hat funktioniert. Hoffe, dass dies für jemand anderen hilfreich sein wird.
quelle
In meinem Fall war eine nicht verwaltete DLL von einer anderen abhängig, die fehlte. In diesem Fall zeigt der Fehler auf die vorhandene DLL anstatt auf die fehlende, was sehr verwirrend sein kann.
Genau das war in meinem Fall passiert. Hoffe das hilft jemand anderem.
quelle
Ich denke, Ihre nicht verwaltete Bibliothek braucht ein Manifest.
Hier erfahren Sie, wie Sie es zu Ihrer Binärdatei hinzufügen. und hier ist warum.
Zusammenfassend kann gesagt werden, dass mehrere weiterverteilbare Bibliotheksversionen in Ihrer Box installiert werden können, aber nur eine davon sollte Ihrer App entsprechen. Dies ist möglicherweise nicht die Standardeinstellung. Sie müssen dem System daher mitteilen, welche Version Ihre Bibliothek benötigt. Aus diesem Grund das Manifest.
quelle
Setup : 32-Bit Windows 7
Kontext : Installierte einen PCI-GPIB-Treiber, über den ich aufgrund des oben genannten Problems nicht kommunizieren konnte.
Kurze Antwort : Installieren Sie den Treiber neu.
Lange Antwort : Ich habe auch Dependency Walker verwendet , der mehrere fehlende Abhängigkeitsmodule identifiziert hat. Sofort dachte ich, dass es eine verpfuschte Treiberinstallation gewesen sein muss. Ich wollte nicht jede fehlende Datei überprüfen und wiederherstellen.
Die Tatsache, dass ich das Deinstallationsprogramm unter Programme und Funktionen der Systemsteuerung nicht finden konnte, ist ein weiterer Hinweis auf eine fehlerhafte Installation. Ich musste einige * .dll in \ system32 und Registrierungsschlüssel manuell löschen, um eine Neuinstallation des Treibers zu ermöglichen.
Problem behoben.
Der unerwartete Teil war, dass nicht alle Abhängigkeitsmodule aufgelöst wurden. Trotzdem kann jetzt auf die * .dll von Interesse verwiesen werden.
quelle
Ich bin auf das gleiche Problem gestoßen. In meinem Fall hatte ich zwei 32-Bit-PCs. Einer mit .NET4.5 installiert und der andere war ein neuer PC.
Meine 32-Bit-CPP-DLL (Release-Modus-Build) funktionierte einwandfrei mit einem .NET-PC, aber nicht mit einem neuen PC, auf dem der folgende Fehler aufgetreten ist
endlich,
quelle
Das gleiche Problem trat auch bei der Verwendung einer nicht verwalteten c / c ++ - DLL-Datei in einer c # -Umgebung auf.
1.Überprüft die Kompatibilität der DLL mit 32-Bit- oder 64-Bit-CPU.
2.Überprüfen Sie die korrekten Pfade des DLL-Ordners .bin, system32 / sysWOW64 oder des angegebenen Pfads.
3.Überprüft, ob PDB-Dateien (Program Database) fehlen. Dieses Video Dieses gibt Ihnen einen Überblick über PDF-Dateien.
Wenn 32-Bit-C / C ++ - Binärcode in einem 64-Bit-System ausgeführt wird, kann dies auf eine Plattforminkompatibilität zurückzuführen sein. Sie können es über Build> Configuration Manager ändern.
quelle
Beim Importieren der C ++ - DLL in .Net Framework +4 hatte ich das gleiche Problem. Ich habe Project-> Properties-> Build-> Prefer 32-bit deaktiviert und es wurde für mich gelöst.
quelle