Vb.net 在VB中使用fortrandll

Vb.net 在VB中使用fortrandll,vb.net,dll,fortran,Vb.net,Dll,Fortran,我试图自学如何从VB调用fortran子程序。我试图用一些非常简单的例子,但不知怎么的,它不起作用。我正在使用Visual Studio 2010和英特尔Visual Fortran。以下是我正在尝试的代码: SUBROUTINE ARRAYTEST(arr) !DEC$ ATTRIBUTES DLLEXPORT, ALIAS:"ARRAYTEST" :: ARRAYTEST REAL arr(3, 7) INTEGER i, j DO i = 1, 3 DO j = 1, 7

我试图自学如何从VB调用fortran子程序。我试图用一些非常简单的例子,但不知怎么的,它不起作用。我正在使用Visual Studio 2010和英特尔Visual Fortran。以下是我正在尝试的代码:

SUBROUTINE ARRAYTEST(arr)
!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:"ARRAYTEST" :: ARRAYTEST
REAL arr(3, 7)
INTEGER i, j
DO i = 1, 3
    DO j = 1, 7
        arr (i, j) = 11.0 * i + j
    END DO
END DO
END SUBROUTINE
它成功地构建了一个DLL文件。下面是我的Visual basic代码:

Public Class Form1
Private Declare Sub ARRAYTEST Lib "FortTest.DLL" Alias "ARRAYTEST" (ByVal x As Single)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim arr(0 To 2, 0 To 6) As Single
    Call ARRAYTEST(arr(0, 0))
    TextBox1.Text = arr(3, 3)
End Sub

End Class
 当我将DLL文件放入目录并运行代码时,出现以下错误: ForRun.exe中发生了类型为“System.AccessViolationException”的第一次意外异常


我在谷歌上搜索了一下,但没有找到解决办法。如果有人能告诉我我做错了什么,以及如何修复它,我将不胜感激。提前非常感谢。

您可以尝试使用
DllImport
符号,这是我在这个特定场景中使用得最成功的符号(来自VB.NET的FORTRAN)

导入System.Runtime.InteropServices
公开课表格1
私有子按钮1\u单击(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理按钮1。单击
调宽arr(0到2,0到6)作为单个
阵列测试(arr(0,0))
TextBox1.Text=arr(3,3)
端接头
末级
公共模块fortraninterp
_
公共子阵列测试(ByRef x作为单个)
端接头
端模块
  • 我要提到的第一件事是,在传递数组时,必须通过引用传递变量
    ByReference
    。我很确定我们通过引用传递了所有变量,但我不确定如果FORTRAN没有修改它是否有必要。这可能是AccessViolation错误的来源

  • 其次,我使用了StdCall调用约定,但我不能100%确定IVF中默认的调用约定是什么。我们总是在属性头中将其显式设置为
    CDECL

  • 最后,我会小心地将2D(+)数组传递给FORTRAN。我不认为我真的测试过或见过它,但我在IVF开发者论坛上读到FORTRAN转换从.NET传递的数组(行变成列)。还有一件事需要注意


  • 我知道这是一个老问题,但有一个简单的答案,似乎没有人注意到。您已经声明了arr(0到2,0到6),但是您正在调用arr(3,3),它超出了您的声明的范围(0到2中不包含3)。System.AccessViolationException是一种常见错误,通常表示引用了数组边界之外的内容,即试图访问内存中未为此变量保留的内容,从而导致访问冲突

    如果使用TextBox1.Text=arr(2,3),则不应该出现该错误,整个过程应该可以正常工作


    希望这有助于现在看问题的人。

    从未使用过fortran,但显然sub需要指向
    real
    的指针,而您传递的实际
    real
    将被解释为指针。尝试将
    x()声明为Single
    并编组为:
    Private Declare Sub ARRAYTEST Lib“FortTest.DLL”别名“ARRAYTEST”(ByVal x()为Single)
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim arr(0 To 2, 0 To 6) As Single
            ARRAYTEST(arr(0, 0))
            TextBox1.Text = arr(3, 3)
        End Sub
    
    End Class
    
    Public Module FortranInterop
        <DllImport("FortTest.DLL", CallingConvention:=CallingConvention.StdCall, EntryPoint:="ARRAYTEST")> _
        Public Sub ArrayTest(ByRef x as Single)
        End Sub    
    End Module