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

时间:2017-08-22 16:44:32

标签: 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, 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编译器(Parallel XE 2017)编写的。 DLL是使用STDCALL(/iface:stdcall)调用约定构建的。

1 个答案:

答案 0 :(得分:0)

我已经找到了解决方案。我唯一做的就是用这个改变出口线:

!DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE, ALIAS : "prueba_int" :: prueba_int

!DEC$ ATTRIBUTES REFERENCE :: m,n

现在它有效!如果其他人遇到同样的问题,这个帖子很有用: https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/276310