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



我正在尝试将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和Intel Fortran编译器(Parallel XE 2017(编程的。DLL 是使用STDCALL(/iface:stdcall)调用约定生成的。

我已经找到了解决方案。我唯一做的就是用这个更改导出行:

!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

最新更新