编程语言
首页 > 编程语言> > 以uint []的形式将C dll中的无符号长数组返回到C#中,为什么会引发MarshalDirectiveException错误?

以uint []的形式将C dll中的无符号长数组返回到C#中,为什么会引发MarshalDirectiveException错误?

作者:互联网

我正在使用一个指向无符号长数组的指针(处理数据),然后将其发送回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

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

解决方法:

该消息表示p /调用编组器无法将返回值编组到uint []中.

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

>将C#函数声明为返回IntPtr.然后在托管方面,您需要将内存复制到C#代码中分配的uint []中.您可以使用Marshal.Copy来做到这一点.您需要以某种方式找出数组的长度.您还需要处理释放.您的C#代码无法做到这一点.因此,它将不得不在本机代码中调用另一个函数,并要求本机代码取消分配.
>在调用您的本机代码之前,在C#代码中分配uint [].而不使用函数返回值,而是将uint []作为参数传递.这需要调用代码C#代码来知道数组的大小.

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

标签:c-3,c,pinvoke
来源: https://codeday.me/bug/20191031/1976027.html