我正在研究我的硕士论文,需要你的帮助!顺便说一下,我正在学习机械工程......所以我的编程技巧有限。
这是我的问题:
我有一个用C#创建的DLL(我不能发布它,因为它是未发表的研究的一部分)。但它给了我一些数组(1D-Array [],2DArray [,])。
对于使用ABAQUS的模拟,我需要在C ++和/或FORTRAN中导入C#-DLL。
我找到了Robert Giesecke的解决方案来创建一个非托管DLL。我认为这对我来说是最简单的解决方案。 (当然如果有人为我提供了另一种解决方案,包装或其他东西,请发布)
这里是我用R.Giesecke模板创建的非托管C#-DLL的一维数组示例:
using System;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace Testme
{
class Test
{
[DllExport("Get1DArray", CallingConvention = CallingConvention.StdCall)]
public static double Get1DArray([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] double[] STRESS, int i)
{
return STRESS[i];
}
}
}
这里是我的2D数组代码:
using System;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace Testme
{
class Test
{
public static int idx(int a, int b) { int cols = 2; return a * cols + b; }
[DllExport("Set2DArray", CallingConvention = CallingConvention.StdCall)]
public static int Set2DArray([In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] STRAIN, int len)
{
STRAIN[idx(0, 0)] = 0;
STRAIN[idx(0, 1)] = 1;
STRAIN[idx(1, 0)] = 2;
STRAIN[idx(1, 1)] = 3;
STRAIN[idx(2, 0)] = 4;
STRAIN[idx(2, 1)] = 5;
return 0;
}
}
}
Build在两者都取得了成功。如何在C ++和/或FORTRAN中导入DLL?
提前谢谢!答案 0 :(得分:1)
当您使用R. Giesecke的工具编译C#-DLL时,您还应该获得一个* .lib文件。 您需要在FORTRAN链接器设置中引用此lib作为附加库依赖项。它包含加载DLL并使DLL中的函数可用所需的所有代码。
在FORTRAN代码中,您需要使用以下语句声明导入的方法:
!DEC$ ATTRIBUTES DLLIMPORT, ALIAS:'_MethodeName::MethodName
BTW:如果使用RGiesecke,则不需要COM可见性。对C#的访问是本机的,而不是通过COM(也使它快得多)。