2010-12-16 12 views
3

Ich habe ein bestehendes VB6 Programm, das einen Fortran-DLL mit der folgenden Definition nennt:Stack-Überlauf Ausnahme Aufruf Fortran DLL-Funktion von C#

Declare Function START Lib "BackEndLib2.dll" Alias "[email protected]"() As Integer 

Wir sind in dem Prozess zu C#, um die VB6 Anwendung von Migration (.net 4.0) und die Definition ist nun wie folgt:

[DllImport("BackEndLib2.dll", EntryPoint = "[email protected]")] 
public static extern short START(); 

Allerdings, wenn ich den gleichen Funktionsaufruf in C# aufrufe, es führt den dLL-Aufruf liefert erfolgreich verwalteten Code und als wirft eine Stapelüberlaufausnahme nach einer Weile.

Ich habe auch versuchte den gleichen DLL-Aufruf in VB.net mit dem gleichen Ergebnis:

Declare Function START Lib "BackEndLib2.dll" Alias "[email protected]"() As Short 

Jede Idee, warum der gleiche Funktionsaufruf 4.0 einen Stapelüberlauf Ausnahme in .NET liefert aber arbeitet erfolgreich in VB6?

Ich vermute, ich verdirre den Stapel mit dem DLL-Aufruf, aber ich bin mir nicht sicher. Ich habe viele verschiedene Parameter getestet, aber bisher hat noch nichts funktioniert.

Bearbeiten: Dies scheint nur ein Problem in WPF und wenn ich das gleiche Beispiel in Windows Forms erstellen, stürzt es nicht ab.

+1

Gibt es irgendeinen Grund, warum Sie von einem 'Integer' in Ihrer VB6-Version zu einem' short' in der C# gehen? – msarchet

+0

Ich lese, dass VB6 Integer auf ein .net Short mappt. Ich habe auch versucht, Integer als Rückgabetyp, aber das hat auch nicht funktioniert. – Niro

Antwort

2

Ihre [DllImport] -Deklaration entspricht der VB6-Deklarationsanweisung. Es ist wahrscheinlich am besten anzunehmen, dass die VB6-Deklaration falsch war, mit einem zu beginnen, dass Sie durch Glück davongekommen sind. Der Rückgabetyp ist ziemlich seltsam, aber das kann kein Stapelproblem verursachen, da der Rückgabewert durch ein CPU-Register und nicht durch den Stapel geleitet wird.

Starten Sie die Diagnose mit Debug + Windows + Registers. Achten Sie vor und nach dem Anruf auf den Wert von ESP. Wenn es nicht das gleiche ist, dann haben Sie wirklich ein Deklarationsproblem und viele Aufrufe an diese Funktion können den Stapel blasen. Nicht so wahrscheinlich, das erzeugt normalerweise eine MDA-Warnung. Wenn es übereinstimmt, dann kann es nur der Fortran-Code sein, der den Stapel überläuft.

Denken Sie auch daran, dass Sie möglicherweise die falsche Funktion beschuldigen. Die Funktion, die das SOE generiert, ist möglicherweise nicht die, die den Stack verschraubt hat. Mit Blick auf den ESP-Wert können Sie den Störer schnell finden.

+0

Ich habe das ESP überprüft, es ist dasselbe nach dem Anruf. Ich denke, es könnte etwas mit WPF zu tun haben, da ich eine einfache Demo-Anwendung in Windows Forms und WPF erstellt habe. Es funktioniert in Windows-Formularen, überläuft jedoch den Stapel in WPF. Obwohl, wenn ich die Fortran-Aufrufe in einen anderen Thread setze, kann ich es in WPF arbeiten lassen. – Niro

+0

Nun, jetzt wissen Sie sicher, dass es nicht durch die Deklaration verursacht wird. WPF ist hier nicht grundsätzlich anders, pinvoke verhält sich genau so. Denken Sie nur daran, den WPF-Code vermasselt zu haben. –

0

Meine Erfahrung würde sagen, wenn Sie eine Fortran-Deklaration wie haben:

 INTEGER*4 FUNCTION START() 
CDEC$ATTRIBUTES STDCALL, DLLEXPORT :: START 
C..... BODY HERE 
     ENDFUNCTION 

Vielleicht sollten Sie versuchen, die folgenden:

[DllImport(..., CallingConvention = CallingConvention.StdCall)] 
public static extern int Start(); 

Aus Neugier, die Fortran-Compiler, dass DLL erzeugt? Haben Sie angegeben, dass es als STDCALL exportiert werden soll? Möglicherweise müssen Sie die Aufrufkonvention auch in C ändern.

+0

Sieht so aus, als wären die ursprünglichen DLLs mit dem Intel Fortran Compiler 9.0 kompiliert worden. Ich habe keinen Zugriff auf den ursprünglichen Fortran-Quellcode (Maintainer ist im Urlaub), aber das Ändern des Rückgabetyps und der Aufrufkonvention hilft nicht. Das scheint nur ein Problem in WPF zu sein, und wenn ich das gleiche Beispiel in Windows Forms erstelle, stürzt es nicht ab. – Niro

Verwandte Themen