从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无法封送"返回值":无效的托管/非托管类型组合之前

请告诉我问题的原因。

从C dll返回无符号长数组到c#作为int[],为什么会抛出MarshalDirectiveException错误

该消息意味着p/invoke编组器不能将返回值编组到uint[]

我看到你有以下选项:

  1. 声明c#函数返回IntPtr。然后在托管端,您需要将内存复制到c#代码中分配的uint[]中。你可以用Marshal.Copy来做。你需要知道数组的长度。您还需要处理回收。你的c#代码做不到这一点。因此,它将不得不调用本机代码中的另一个函数,并要求本机代码释放。
  2. 在调用本机代码之前,在c#代码中分配uint[]。不使用函数返回值,而是将uint[]作为参数传递。这需要调用代码,c#代码,知道数组需要多大。

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