为什么我的VB.NET应用程序没有读取此Fortran DLL?
我正在尝试将Fortran动态链接库(DLL)与VB.NET应用程序链接。DLL中包含的子例程应该修改VB端提供的值为什么我的VB.NET应用程序没有读取此Fortran DLL?,vb.net,dll,fortran,Vb.net,Dll,Fortran,我正在尝试将Fortran动态链接库(DLL)与VB.NET应用程序链接。DLL中包含的子例程应该修改VB端提供的值c,但它没有这样做:它保持c不变 以下是Fortran代码: SUBROUTINE prueba_int(m,n,p) !DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS : "prueba_int" :: prueba_int !DEC$ ATTRIBUTES REFERENCE :: m,n IMPLICIT NONE INTEGER, IN
c
,但它没有这样做:它保持c
不变
以下是Fortran代码:
SUBROUTINE prueba_int(m,n,p)
!DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS : "prueba_int" :: prueba_int
!DEC$ ATTRIBUTES REFERENCE :: m,n
IMPLICIT NONE
INTEGER, INTENT(IN) :: m,n
INTEGER,INTENT(OUT) :: p
p=m*n
END SUBROUTINE
下面是VB.NET部分:
Public Class Form1
Public Declare Sub prueba_int Lib "Dll2.dll path" (ByRef m As Integer, ByRef n As Integer, ByRef p As Integer)
Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
ofd.Filter = "(*txt)|*.txt"
If (ofd.ShowDialog() = DialogResult.OK) Then
txtArray.Text = ofd.FileName
End If
End Sub
Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
Dim a, b, c As Integer
a = CInt(txt1.Text)
b = CInt(txt2.Text)
c = 1
Call prueba_int(a, b, c)
MsgBox(c) 'Only to check c's value
End Sub
End Class
我已经尝试使用LONG
而不是INTEGER
,但问题仍然存在。有人能给我一个关于这个问题的线索吗
编辑:VB.NET和FORTRAN代码均使用Visual Studio 2015和英特尔FORTRAN编译器(并行XE 2017)进行编程。DLL是使用
STDCALL(/iface:STDCALL)
调用约定构建的。我已经找到了解决方案。我做的唯一一件事就是用这一行更改出口行:
!DEC$ATTRIBUTES DLLEXPORT,STDCALL,REFERENCE,别名:“prueba_int”::prueba_int
!DEC$属性参考::m,n
现在它工作了!如果其他人有相同的问题,此线程非常有用:
我已经找到了解决办法。我做的唯一一件事就是用这一行更改出口行:
!DEC$ATTRIBUTES DLLEXPORT,STDCALL,REFERENCE,别名:“prueba_int”::prueba_int
!DEC$属性参考::m,n
现在它工作了!如果其他人有相同的问题,此线程非常有用:
我对Fortran不太在行,所以请对我说的话持保留态度。。。但你把m和n标记为IN,p标记为OUT。但是在vb中,它们都被声明为ByRef。我原以为m和n应该是ByVal,只有p是ByRef。谢谢你的回答,@ErikWestwig!我正将
ByVal
与m
和n
一起使用,但如果我这样做,则会出现异常系统。AccessViolationException
出现,并伴有试图覆盖受保护内存的警告。对它们使用ByRef
是避免它的唯一方法。我认为如果你想更改c.Hi,@M.Chinoune的值,你必须将p
声明为INTENT(INOUT)!我已经更改为INOUT,但仍然失败。我对Fortran不太在行,所以请恕我直言。。。但你把m和n标记为IN,p标记为OUT。但是在vb中,它们都被声明为ByRef。我原以为m和n应该是ByVal,只有p是ByRef。谢谢你的回答,@ErikWestwig!我正将ByVal
与m
和n
一起使用,但如果我这样做,则会出现异常系统。AccessViolationException
出现,并伴有试图覆盖受保护内存的警告。对它们使用ByRef
是避免它的唯一方法。我认为如果你想更改c.Hi,@M.Chinoune的值,你必须将p
声明为INTENT(INOUT)!我已更改为INOUT,但仍然失败。