我目前正致力于将用Fortran编写的DLL导入Visual Basic。我已经掌握了所有的基础知识,所以现在我试图更进一步。标题基本上都说明了一切,但我会解释它到底是做什么的。
对于踢和傻笑,让我们假设我想传递一个有三个双值的对象,可能代表三维空间中的一个点。在我的Fortran方法中,我想获取该对象,打印出x值,然后将x值更改为7.5。这是我的Fortran代码,就是这样。
module test
type Point
double precision x, y, z
end type Point
end module test
function ex1(ThreeDubs)
use test
type (Point) :: ThreeDubs
print *, ThreeDubs%x
ex1 = 1
return
end function
这段代码效果很好!......仅适用于结构。换句话说,假设我在VB中有以下结构和类
Public Structure StructurePoint
Public x As Double
Public y As Double
Public z As Double
End Structure
Public Class ObjectPoint
Public x As Double
Public y As Double
Public z As Double
End Class
创建StructurePoint的实例可以产生完美的结果:Fortran方法打印出x值,然后修改x的值。完善。现在问题。当我传递ObjectPoint的一个实例时,程序打印出一个类似于1.523E-306的值。基本上,告诉我它认为x值所在的位置不是x值。所以,这就是我的问题。甚至可以将一个Object传递给Fortran DLL并正确访问它,如果是这样,我将如何进行呢?
解决方案
为了将此对象传递给Fortran,修改类声明是唯一必须完成的事情。
<StructLayout(LayoutKind.Sequential)> _
Public Class CustomPoint3d
Public x As Double
Public y As Double
Public z As Double
End Class
<DllImport("passPoint3d.dll")> _
Public Shared Function PrintX(ByVal point As CustomPoint3d) As Boolean
End Function
答案 0 :(得分:1)
我不了解Visual Basic,但我在Fortran&amp;之间共享了用户定义的类型。 C.这得到了Fortran 2003的ISO C Binding的支持,Fortran 95编译器已经广泛支持它。您声明Fortran用户定义的类型,并为其提供绑定C属性和绑定名称。只要该类型的所有子组件都可与C互操作,则用户定义的类型也可与C互操作。并且该方法是标准的和便携的。我通过将Fortran用户定义的类型变量作为模块变量传递信息来完成此操作,并且C结构变量通过在文件顶部声明而在全局内存中。也许你可以在Fortran端使用ISO C Binding,并以某种方式告诉Visual Basic使用类似C的界面?
答案 1 :(得分:1)
这可能很难,我认为没有任何好处,所以我建议你不要打扰!
无论如何都要去!我认为VB.Net对象将被编组为指针。 Fortran 90中有some support指针。如果您将pointer
添加到ThreeDubs
的Fortran声明中,它可能会有效。
function ex1(ThreeDubs)
use test
type (Point), pointer :: ThreeDubs ! Note additional pointer keyword
print *, ThreeDubs%x
ex1 = 1
return
end function
我怀疑你是否能够从Fortran调用ThreeDubs
对象中的方法,所以我不确定传递对象的好处。
以下是PInvoke上的two articles:PInvoke是用于调用oldschool“非托管”DLL(如Fortran)的.Net名称。这些文章解释了如何将.Net参数“编组”(翻译)到Fortran DLL中。您可以使用属性控制编组:文章解释更多。他们倾向于使用C和C#作为例子:(