2016-08-05 9 views
-2

zu importieren Ich versuche, bei C++ Project Dll zu einem C# -Projekt zu importieren. Ich habe eine Menge Leute gefunden, die über die Verwendung von DllImport sprechen. Ich habe versucht, dass die Verwendung und hier ist das, was ichNicht möglich, C++ DLL in C# -Projekt mit DllImport

CPP-Code haben-:

int __declspec(dllexport) beginCode(double reportId); 

C# Code:

[DllImport("C:\\Users\\<my_user_id>\\Desktop\\ctxmix\\Release\\ctxmix.dll",CallingConvention =CallingConvention.Cdecl ,CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
public static extern int beginCode(double reportId); 
int result = beginCode(reportId); 

Aber wenn ich laufe, ich bin immer eine Ausnahme - Ausnahme ausgelöst: 'System.DllNotFoundException'

Muss ich irgendwelche Referenzen für die CPP Dll in der hinzufügen Projekt oder irgendetwas anderes außer dem Code, den ich oben habe?

Edit: Ich versuche, meine .exe mit VS2015 auszuführen, und ich bekomme diese Ausnahme auf meinem lokalen Rechner. Außerdem sehe ich meine CPP-DLL nicht im Bereich Projekt-> Referenzen, wo ich andere Referenzen sehe.

+0

Nein, es ist kein Duplikat, da sie auf dem Computer erfolgreich ausgeführt werden können, aber nicht auf einem anderen Windows 2003-Computer. In meinem Fall bekomme ich diese Ausnahme in meinem Computer, wenn ich es mit VS2015 starte. – Teja

+0

Ich würde den Befehl 'dumpbin/exports [Ihre DLL hier]' verwenden (in der Visual Studio-Eingabeaufforderung enthalten), um zu sehen, was der exportierte Funktionsname tatsächlich ist. Odds sind, der C++ - Compiler ist name-manging beginCode zu etwas anderem, so dass es die Funktion nicht finden kann. Sie können dies möglicherweise beheben, indem Sie "ExactSpelling" in false ändern. Ich denke auch nicht, dass CallingConvention.Cdecl für eine C++ DLL geeignet ist, ich denke, dass Sie StdCall wollen. – Cody

+1

Danke @ Cody. Ich habe Dependency Walker verwendet und festgestellt, dass einige verwandte Abhängigkeiten nicht abgerufen werden können. Ich habe sie zum Ordner C: \ Windows \ System32 hinzugefügt und diesen in der Umgebungsvariablen 'Path' hinzugefügt. Jetzt kann ich diesen Fehler umgehen. Vielen Dank. – Teja

Antwort

0

Die nicht verwaltete DLL muss von Ihrem verwalteten Prozess lokalisiert werden können. In der Regel bedeutet dies, dass die DLL im selben Verzeichnis wie die ausführbare Datei abgelegt wird. Aber du hast einen absoluten Pfad benutzt, von dem ich annehme, dass du ihn korrekt transkribiert hast.

Sie können diesen Fehler auch auftreten, wenn die Abhängigkeiten der DLL nicht gefunden werden können. Das scheint die wahrscheinliche Erklärung hier zu sein. Höchstwahrscheinlich kann die MSVC-Laufzeit nicht gefunden werden, wenn Ihre DLL geladen ist.

Die Verwendung eines absoluten Pfads ist keine gute Idee. Das wird zusammenbrechen, wenn Sie auf eine andere Maschine verteilen. Verwenden Sie nur den Namen der DLL-Datei und platzieren Sie sie im selben Verzeichnis wie die ausführbare Datei.

Ihr DllImport-Attribut scheint wählerisch. Kein Punkt, der CharSet angibt, wenn kein Text vorhanden ist. Ich bezweifle, dass Ihre Funktion SetLastError aufruft. Und brauchst du ExactSpelling wirklich?

+0

Ich aktualisierte die DllImport-Zeile zu - [DllImport ("ctxmix.dll", CallingConvention = CallingConvention.Cdecl)] Und auch die cpp dll an der gleichen Stelle wie exe platziert. Aber ich bekomme immer noch den gleichen Fehler. Ich verwende dies mit VS2015. Also, ich nehme an, es sollte alle damit verbundenen Abhängigkeiten richtig machen? Außerdem sehe ich meine CPP-DLL nicht im Bereich "Projektreferenzen". Ich frage mich, ob das ein Problem sein könnte? – Teja

+0

Nein, Sie brauchen die DLL nicht als Referenz. Entweder die DLL oder ihre Abhängigkeiten können nicht gefunden werden. –

+0

Danke @David. Ich habe Dependency Walker verwendet und festgestellt, dass einige verwandte Abhängigkeiten nicht abgerufen werden können. Ich habe sie zum Ordner C: \ Windows \ System32 hinzugefügt und diesen in der Umgebungsvariablen 'Path' hinzugefügt. Jetzt kann ich diesen Fehler umgehen. Vielen Dank. – Teja