我正在努力让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)
答案 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函数,该函数将接收函数创建的数据并将其返回给调用者。