2016-07-29 30 views
0

Ich versuche, DLL in VB.NET 2010 aufzurufen, die von Fortran 90 generiert wird (der Compiler ist Intel Parallel Studio XE 2011). Der "PInvokeStackImbalance" tritt jedoch auf, wenn ich ihn ausführe. Ich habe die folgenden Methoden versucht: (1) Ändern Sie die Daten Tye in der Deklaration, wie "INTEGER", "LONG", "INT32" ..., aber der Fehler noch immer beendet. (2) Überprüfen Sie die Dimension des Arrays im aktuellen virtuellen Parameter &. Da beim Transport kein Array vorhanden ist, wird diese Methode ignoriert. (3) Deaktivieren Sie die Optionen für "ContextSwitchDeadlock" und "PInvokeStackImbalance" in "Debug - Ausnahmen - verwaltete Debugging-Assistenten" .Ich denke, es kann das eigentliche Problem nicht lösen, also verwende ich es nicht.PInvokeStackImbalance beim Aufruf "DLL" (generiert von Fortran) in VB.NET 2010

Ich bemerke, dass der Fehler in verschiedenen Zirkulation auftritt (siehe Abbildung unten, in 98 und 99 auftreten). Bedeutet das, dass die DLL selbst einige Fehler anstelle der Schnittstelle haben? enter image description here enter image description here

Unten ist mein Code in VB.net und die Erklärung in Fortan. (1) VB.net:

Public Class Form1 
    Public Declare Sub main_sub Lib "smgama_dll.dll" (ByRef cla As Long, ByRef nf As Long) 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim cla, nf As Long 
     cla = CLng(TextBox1.Text) 
     nf = CLng(TextBox2.Text) 
     Call main_sub(cla, nf) 
    End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Application.Exit() 
End Sub 
End Class 

(2) Fortran:

subroutine main_sub(cla,nf) 
    !DEC$ ATTRIBUTES DLLEXPORT::main_sub 
    !DEC$ ATTRIBUTES ALIAS:"main_sub"::main_sub 

    use Global 
    use suba 
    use suba1 
    use suba2 

    implicit none 
    real,allocatable::upbound(:),downbound(:),xbest(:),y(:),ybest(:),upbound1(:),downbound1(:),g_x(:),g_y(:) 
    real,allocatable::QC(:),QCC(:),Q_mean(:) 
    character(len=20)::filename 
    integer::n,szz,tt,nf,i,iter,cla,j 
...... 
End subroutine 
+1

Wenn Sie zu einem späteren Zeitpunkt eine Verknüpfung zu einem Bild bereitstellen und die Aufforderung "Bildbeschreibung hier eingeben" angezeigt wird, geben Sie die Bildbeschreibung ein. – jmcilhinney

+0

Dies ist eine VB6-Deklaration. In VB.NET "Ganzzahl" = Ganzzahl, nicht Long. –

Antwort

0

Ein Stapel Ungleichgewicht fast immer ergibt sich aus einer VB6 Erklärung in VB.NET verwenden. Die meisten API-Funktionen arbeiten mit 32-Bit-Nummern, das heißt in VB6 und in VB.NET Integer. Wenn Sie verwenden, was Sie sind, dann verwenden Sie fast sicher VB6-Deklarationen. Ändern Sie die Typen zu Integer mindestens und es kann funktionieren, oder Sie müssen möglicherweise einige andere Änderungen auch.