从C dll返回无符号长数组到c#作为int[],为什么会抛出MarshalDirectiveException错误
本文关键字:为什么 错误 MarshalDirectiveException int 作为 返回 dll 无符号 数组 | 更新日期: 2023-09-27 17:49:26
我使用一个指向unsigned long数组的指针(操纵数据),然后将其发送回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无法封送"返回值":无效的托管/非托管类型组合之前请告诉我问题的原因。
该消息意味着p/invoke编组器不能将返回值编组到uint[]
。
我看到你有以下选项:
- 声明c#函数返回
IntPtr
。然后在托管端,您需要将内存复制到c#代码中分配的uint[]
中。你可以用Marshal.Copy
来做。你需要知道数组的长度。您还需要处理回收。你的c#代码做不到这一点。因此,它将不得不调用本机代码中的另一个函数,并要求本机代码释放。 - 在调用本机代码之前,在c#代码中分配
uint[]
。不使用函数返回值,而是将uint[]
作为参数传递。这需要调用代码,c#代码,知道数组需要多大。
如果你可以选择选项2,它将导致接口两边的代码更简单。我的猜测是,返回数组的长度与输入数组相同。在这种情况下,选择选项2。