将无符号长数组从C dll返回到C#作为uint []为什么抛出MarshalDirectiveException错误?

时间:2012-12-23 19:14:11

标签: c# c pinvoke

我正在使用指向无符号长数组的指针(操作数据),然后将其发送回C#

在C#中

[DllImport("some_dll.dll")]
private static extern uint[] func(uint[]x, uint[]y, uint[]z);

C标题

_declspec(dllexport) unsigned long* _stdcall func(unsigned long[],
    unsigned long[],unsigned long[]);

错误

MarshalDirectiveException
Cannot marshal 'return value': Invalid managed/unmanaged type combination

请让我知道导致问题的原因。

1 个答案:

答案 0 :(得分:4)

该消息表示p / invoke marshaller无法将返回值编组到uint[]中。

我认为你有以下选择:

  1. 将C#函数声明为返回IntPtr。然后在托管端,您需要将内存复制到C#代码中分配的uint[]。您可以使用Marshal.Copy来执行此操作。不知何故,你需要找出数组的长度。您还需要处理释放。您的C#代码无法做到这一点。因此,它必须在本机代码中调用另一个函数,并要求本机代码解除分配。
  2. 在调用本机代码之前,在C#代码中分配uint[]。您可以将uint[]作为参数传递,而不是使用函数返回值。这需要调用代码C#代码才能知道数组需要多大。
  3. 如果您可以选择选项2,则会在界面的两侧产生更简单的代码。我的猜测是返回数组与输入数组的长度相同。在这种情况下,请选择选项2。