2009-05-09 5 views
0

Ich versuche zu lernen, wie verwaltete/unmanaged Code Interop zu verwenden, aber ich habe eine Wand, die 4 Stunden Googeln konnte nicht getroffen Komm drüber hinweg. Ich habe 2 Projekte in Visual Studio zusammengestellt, von denen eines eine Win32-Exe erstellt und das andere eine Windows-Forms-.NET-Anwendung erstellt. Nach einem Haufen Mucking habe ich den C# -Code bekommen, um den C++ - Code korrekt aufzurufen, aber von hier aus habe ich AccessViolationException immer dann bekommen, wenn ich dort reingekommen bin. Hier ist der Code aus der CPP-Datei:AccessViolationException beim Aufruf der grundlegendsten C++ - Funktion, die ich aus verwaltetem Code denken kann

 extern "C" __declspec(dllexport) void QuickTest() 
    { 
     int iTest = 0; 
     int aTestArray[3] = {1,2,3}; 
     return; 
    } 

Und hier ist der Code aus dem C# Windows Forms es App aufrufen:

 [DllImport("UnmanagedEvaluation2.exe")] 
     static extern void QuickTest(); 

Ziemlich einfach nicht wahr? Der Aufruf funktioniert, und ich bin in der Lage, in den C++ - Code zu treten (ich habe das nicht verwaltete Debugging für das Projekt aktiviert), aber es stirbt auf dem Array, das jedes Mal mit AccessViolationException eine Zeile erstellt. Derselbe Code läuft gut, wenn ich die ausführbare Datei ausführe (der C++ - Code ist in einem Konsolenanwendungsprojekt, ich habe versucht, ihn von der _tmain-Funktion aufzurufen und keine Probleme), aber wenn er von .NET aufgerufen wird, explodiert er jedes Mal.

Es muss etwas offensichtlich sein, dass ich hier vermisse, aber ich habe nichts Nützliches aus dem Lesen von Tutorials gefunden, und die meisten Probleme über diese Ausnahme sind Leute, die Probleme mit komplizierten Marshallings oder GCHandles haben. Vielen Dank im Voraus für jede Hilfe.

Update: Sie waren direkt darunter, aber es ist seltsam. Zuerst, als ich damit anfing, nahm ich an, dass ich das nicht tun würde (Aufrufe von Funktionen in ausführbaren Dateien), aber als ich es versuchte - es funktionierte wirklich, der Aufruf, der ist. Es scheint so, als ob man eine Funktion in eine ausführbare Datei einfügen kann, aber sobald man versucht, Speicher zuzuordnen, stirbt es. Irgendwie, danke für den Rat, scheint es jetzt richtig zu funktionieren.

Antwort

2

Sie können Funktionen in ausführbaren Dateien nicht von außerhalb dieser ausführbaren Dateien aufrufen. Sie müssen Ihren Code in eine DLL kompilieren.

+1

ODER Sie müssen dem Compiler mitteilen, dass einige Symbole exportiert werden müssen. Ich habe einige exe gemacht, bevor exportierte Symbole wie dll. Es ist fast dasselbe, nur die Konfigurations- und Compiler-spezifischen dllimport/export-Spezifizierer müssen geändert werden. – Klaim

0

Sie haben Ihre Funktion als extern "C" deklariert, was bedeutet, dass sie cdecl als Aufrufkonvention verwendet. Standardmäßig verwendet DllImportStdCall als die rufende Konvention. Dies könnte der Grund für den Absturz Ihres Codes sein.

Versuchen Sie Ihre Funktion in .NET-Code als

[DllImport("UnmanagedEvaluation2.exe", CallingConvention=CallingConvention.Cdecl)] 
    static extern void QuickTest(); 

Siehe http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx für weitere Informationen zu importieren.

Verwandte Themen