在VB.NET 2010中调用" DLL"(由Fortran生成)时的PInvokeStackImbalance

时间:2016-07-29 04:56:02

标签: vb.net dll fortran fortran90

我试图在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

1 个答案:

答案 0 :(得分:0)

堆栈不平衡几乎总是在VB.NET中使用VB6声明。大多数API函数使用32位数字,这意味着VB6中为null,VB.NET中为Long。如果您正在使用Integer,那么您几乎肯定会使用VB6声明。至少将Long类型更改为Long,它可能会有效,或者您可能还需要进行其他更改。