Vb.net 在VB中使用fortrandll
我试图自学如何从VB调用fortran子程序。我试图用一些非常简单的例子,但不知怎么的,它不起作用。我正在使用Visual Studio 2010和英特尔Visual Fortran。以下是我正在尝试的代码: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
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错误的来源CDECL
我知道这是一个老问题,但有一个简单的答案,似乎没有人注意到。您已经声明了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