如何将动态结构从vb.net传递给Fortran DLL

时间:2013-11-19 15:53:41

标签: vb.net dll fortran

我无法将结构或类从vb.net传递到我的Fortran DLL。特别是我想传递动态成员(即具有动态内存分配的1D数组)的结构或类。我实际上可以传递固定大小的数组但不能传递动态数组。任何帮助将受到高度赞赏!

例如,如果我有以下结构:

Module Module1
<DllImport(DLL path, CallingConvention:=CallingConvention.StdCall)> _
Sub sub1(ByRef ppkg As Ppkg)
End Sub

<StructLayout(LayoutKind.Sequential)>
Structure Ppkg
   Dim id As Integer
   Dim arr() As Integer
End Structure

Sub Main()
    Dim pkgx As Ppkg = New Ppkg()
    sub1(pkgx)
End Sub 

在Fortran方面:

module Test

type Ppkg
  integer           :: id
  integer, pointer  :: arr(:)
end type

contains

  subroutine sub1(aPpkg)
     type(Ppkg), intent(inout)   :: aPpkg         
     !DEC$ ATTRIBUTES DLLEXPORT  :: sub1
     !DEC$ATTRIBUTES STDCALL     :: sub1
     !DEC$ATTRIBUTES ALIAS       : 'sub1' :: sub1
     !DEC$ ATTRIBUTES REFERENCE  :: aPpkg
     ! ... do something
  end subroutine sub1

end module Test

当从vb.net调用sub1时,我无法访问aPpkg%arr的成员。但是,如果我在结构或类的定义中使用以下内容:

<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim arr() As Integer

并在类型定义(Fortran)中使用:

integer :: arr(4)

事情有效,但数组的大小是固定大小而不是动态的。有帮助吗?提前谢谢!

0 个答案:

没有答案