我试图在VB.NET 2010中调用DLL,这是由Fortran 90生成的(编译器是Intel Parallel Studio XE 2011)。然而," PInvokeStackImbalance"当我运行它时发生。 我尝试过以下方法: (1)更改声明中的数据tye,例如" INTEGER"," LONG"," INT32" ...,但错误仍然存在。 (2)检查实际和虚拟参数中的数组维数。由于传输时没有数组,忽略该方法。 (3)取消选中" ContextSwitchDeadlock"的选项。和" PInvokeStackImbalance" in" Debug - Exceptions - Managed Debugging Assistants"。我认为它无法解决真正的问题,所以我不能使用它。
我注意到错误发生在不同的循环中(见下图,分别出现在98和99中)。这是否意味着DLL本身有一些错误而不是接口? enter image description here enter image description here
下面是我在VB.net中的代码和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
答案 0 :(得分:0)
堆栈不平衡几乎总是在VB.NET中使用VB6声明。大多数API函数使用32位数字,这意味着VB6中为null
,VB.NET中为Long
。如果您正在使用Integer
,那么您几乎肯定会使用VB6声明。至少将Long
类型更改为Long
,它可能会有效,或者您可能还需要进行其他更改。