我正在使用指向无符号长数组的指针(操作数据),然后将其发送回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
请让我知道导致问题的原因。
答案 0 :(得分:4)
该消息表示p / invoke marshaller无法将返回值编组到uint[]
中。
我认为你有以下选择:
IntPtr
。然后在托管端,您需要将内存复制到C#代码中分配的uint[]
。您可以使用Marshal.Copy
来执行此操作。不知何故,你需要找出数组的长度。您还需要处理释放。您的C#代码无法做到这一点。因此,它必须在本机代码中调用另一个函数,并要求本机代码解除分配。uint[]
。您可以将uint[]
作为参数传递,而不是使用函数返回值。这需要调用代码C#代码才能知道数组需要多大。如果您可以选择选项2,则会在界面的两侧产生更简单的代码。我的猜测是返回数组与输入数组的长度相同。在这种情况下,请选择选项2。