我正在尝试在C#中使用Fortran DLL,而我没有使用Fortran的经验。我遇到问题的部分是dll的输出参数,特别是字符。在Fortran代码中,它们被定义为:
character*32 JobName
character*(*) Fname
character*80 Title(2)
有没有人知道C#中的等价物?所有其他人都是整体,所以我可以处理它们。从阅读开始,我不能直接使用char,因为它在C#中是8个字节,在Fortran中是4个。
更多的Fortran代码如下:
*deck,ResRdBegin
function ResRdBegin (Nunit, Lunit, Fname, ncFname, Title, JobName, Units, NumDOF, DOF, UserCode, MaxNode, NumNode, MaxElem, NumElem, MaxResultSet,NumResultSet)
integer ResRdBegin, Nunit, Lunit, ncFname, Units, iTemp(100), NumDOF, DOF(*), UserCode, kbf, NumResultSet, MaxNode, NumNode, MaxElem, NumElem, MaxResultSet, i,j
character*32 JobName
character*(*) Fname
character*80 Title(2)
答案 0 :(得分:0)
您应该能够在C#中使用char [](使用CharSet.Ansi)将字符数组传递给Fortran。对于2x80字符数组,我只传入一个160字符的数组。字符*(*)变量的长度通过ncFname参数定义为输入。使用[In,Out]指定数组参数的输入和输出。标量应该通过参考传递。
http://www.luckingtechnotes.com/calling-fortran-dll-from-csharp/
P / Invoke签名应如下所示。
[DllImport("binlib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int RESRDBEGIN(ref int Nunit, ref int Lunit, [In] char[] Fname, ref int ncFname, [In, Out] char[] Title, [In, Out] char[] JobName,
ref int Units, ref int NumDOF, [In, Out] int[] DOF, ref int UserCode,
ref int MaxNode, ref int NumNode, ref int MaxElem, ref int NumElem,
ref int MaxResultSet, ref int NumResultSet);
我也运行ANSYS。我测试过,这种方法似乎有效 - 返回有效数据。但是,如果在调用之前设置断点,则调试器会抛出AccessViolation,因此我可能会遗漏某些内容。如果在通话后设置了断点,则没有问题。