3

我正在使用指向无符号长数组(操作数据)的指针,然后将其发送回 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
无法封送“返回值”:托管/非托管类型组合无效

请让我知道是什么导致了问题。

4

1 回答 1

4

该消息意味着 p/invoke 编组器无法将该返回值编组为uint[].

在我看来,您有以下选择:

  1. 将 C# 函数声明为返回IntPtr. 然后在托管方面,您需要将内存复制到uint[]C# 代码中分配的内存中。你可以用它Marshal.Copy来做到这一点。不知何故,您需要找出数组的长度。您还需要处理解除分配。您的 C# 代码无法做到这一点。所以它必须在本机代码中调用另一个函数并要求本机代码解除分配。
  2. uint[]在调用本机代码之前在 C# 代码中分配。不是使用函数返回值,而是uint[]作为参数传递。这需要调用代码(即 C# 代码)来了解数组需要多大。

如果您可以选择选项 2,它将导致界面两侧的代码更简单。我的猜测是返回数组与输入数组的长度相同。在这种情况下选择选项 2。

于 2012-12-23T19:42:04.340 回答