在C ++ / FORTRAN中使用非托管C#-DLL

时间:2014-06-27 20:14:24

标签: c# fortran pinvoke

我正在研究我的硕士论文,需要你的帮助!顺便说一下,我正在学习机械工程......所以我的编程技巧有限。

这是我的问题:

我有一个用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?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

当您使用R. Giesecke的工具编译C#-DLL时,您还应该获得一个* .lib文件。 您需要在FORTRAN链接器设置中引用此lib作为附加库依赖项。它包含加载DLL并使DLL中的函数可用所需的所有代码。

在FORTRAN代码中,您需要使用以下语句声明导入的方法:

!DEC$ ATTRIBUTES DLLIMPORT, ALIAS:'_MethodeName::MethodName

BTW:如果使用RGiesecke,则不需要COM可见性。对C#的访问是本机的,而不是通过COM(也使它快得多)。