[英]Calling FORTRAN dll from C# and assigning values to array of structures
我可以将C#
结构传递给FORTRAN
就好了。 我什至可以将C#
FORTRAN
的TYPE()
数组传递。 当我尝试将值返回到C#
时,我遇到了麻烦。 这是一个例子:
fortran dll 是:
MODULE TESTING
TYPE VALUEREF
INTEGER*4 :: A
ENDTYPE VALUEREF
CONTAINS
SUBROUTINE TEST_REF(T,N)
!DEC$ ATTRIBUTES DLLEXPORT :: TEST_REF
!DEC$ ATTRIBUTES ALIAS:'TEST_REF' :: TEST_REF
!DEC$ ATTRIBUTES VALUE :: N
IMPLICIT NONE
INTEGER*4 :: A,I,N
TYPE(VALUEREF) :: T(N)
A = 100
DO I=1,N
T(I)%A = A + I
END DO
END SUBROUTINE
END MODULE
和C#
调用 function 期望结果是:
[StructLayout(LayoutKind.Sequential)]
public struct ValueRef
{
public int a;
}
[DllImport("mathlib.dll")]
static extern void TEST_REF(ValueRef[] t, int n);
void Main()
{
ValueRef[] T = new ValueRef[4];
for (int i = 0; i < T.Length; i++)
{
T[i].a = i;
}
Console.WriteLine("Initialize");
for (int i = 0; i < T.Length; i++)
{
Console.WriteLine(" A={0}", T[i].a);
}
Console.WriteLine("Call Fortran");
TEST_REF(T, T.Length);
for (int i = 0; i < T.Length; i++)
{
Console.WriteLine(" A={0}", T[i].a);
}
}
结果:
Initialize
A=0
A=1
A=2
A=3
Call Fortran
A=0
A=1
A=2
A=3
通过 FORTRAN 代码进行调试,我看到初始值从C#
传递到FORTRAN
就好了。 这些值被新值覆盖,并且控制权被传递回C#
,其中旧值仍包含在ValueRef
实例中。
为什么我可以以类似的方式传递和返回一个float
或int
数组,就好了。 我可以使用ref
关键字传递和返回奇异结构,我可以传递但不能返回和数组struct
?
附言。 我正在使用 Compaq Visual Fortran 6.5 & .NET 3.5
PS2 。 我很感激对此的任何评论/想法。 我的项目完成了 95%,现在我遇到了这个问题。 这个项目的重点是尽可能地使用结构来减少传递给函数的#of arguments 并保留 OOP 设计的某些方面。
我过去使用指针而不是数组来完成此操作。 我认为您的结构正在为 P/Invoke 调用复制:
[DllImport("mathlib.dll")]
static extern void TEST_REF(ValueRef* t, int n);
在调用该方法之前,您需要固定您的数组。
fixed (ValueRef* pointer = t)
{
TEST_REF(pointer, n);
}
编辑:根据评论,解决方案是将外部声明为
[DllImport("mathlib.dll")]
static extern void TEST_REF([Out] ValueRef[] t, int n);
这是有关 arrays 编组的MSDN参考,以及它们如何默认为[In]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.