为什么我的VB.NET应用程序没有读取此Fortran DLL?

为什么我的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

我正在尝试将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, 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,但仍然失败。