将C ++ int *编组到C#

时间:2010-12-06 04:15:41

标签: c# c++ marshalling

我正在努力让dll工作。

DLL是用C ++编写的,需要将int *传递给C#。我花了几天时间才开始工作,但它失败了。我开始拔头发,因为我无法弄清楚出了什么问题。我尝试了一切。我不像C#那样熟悉C ++,所以问题可能来自那里......

它从dll读取正常,但返回的值不正确。我删除了输入,我只是想通过测试数组。我在C ++中使用的函数是:

extern "C" EAGLE128DLL_API int* encryptFunc()
{
    //return encrypt(x, Q);

    int t[128];

    for(int i = 0; i < 128; i++)
    {
        t[i] = 5;
    }

    return t;
};

我用来调用此函数的C#代码如下:

[DllImport("C:\\Users\\Leon\\Documents\\Visual Studio 2010\\Projects\\Eagle128DLL\\Release\\Eagle128DLL.dll")]
            public static extern IntPtr encryptFunc();
    ...

IntPtr outputPtr = encryptFunc();
int[] output = new int[128];

Marshal.Copy(outputPtr, output, 0, 128);

输出数组中的值应为全5。但我得到的是: 16187392,16190224..etc(not 5's)

2 个答案:

答案 0 :(得分:3)

C ++代码包含一个错误:您正在返回一个指向存储在堆栈中的变量的指针(t[128]只是一个临时变量),这将无效。只要您的encryptFunc返回,call stack will be unwound和变量t[128]就会被删除。

如果您的代码不需要重入或线程安全,您可以简单地t[128]静态:

static int t[128];
...
return t;

静态变量将不再存储在堆栈中,并将在函数结束时继续存在。

答案 1 :(得分:2)

我认为你的问题是你试图在C函数中返回已在本地声明的值。

最好的方法是将预分配的数组传递给C函数,该函数将接收函数创建的数据并将其返回给调用者。