gpt4 book ai didi

c# - 将无符号长数组作为 uint[] 从 C dll 返回到 C# 为什么抛出 MarshalDirectiveException 错误?

转载 作者:行者123 更新时间:2023-11-30 15:36:09 24 4
gpt4 key购买 nike

我正在使用一个指向无符号长数组的指针(处理数据),然后将它发送回 C#

在 C# 中

[DllImport("some_dll.dll")]
private static extern uint[] func(uint[]x, uint[]y, uint[]z);

C header

_declspec(dllexport) unsigned long* _stdcall func(unsigned long[],
unsigned long[],unsigned long[]);

错误

MarshalDirectiveExceptionCannot marshal 'return value': Invalid managed/unmanaged type combination

请告诉我是什么导致了这个问题。

最佳答案

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

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

  1. 将 C# 函数声明为返回 IntPtr。然后在托管端,您需要将内存复制到 C# 代码中分配的 uint[] 中。您可以使用 Marshal.Copy 来做到这一点。您需要以某种方式找出数组的长度。您还需要处理重新分配。您的 C# 代码无法做到这一点。因此它将不得不调用 native 代码中的另一个函数并要求 native 代码解除分配。
  2. 在调用 native 代码之前,在 C# 代码中分配 uint[]。您不使用函数返回值,而是将 uint[] 作为参数传递。这需要调用代码(C# 代码)知道数组需要多大。

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

关于c# - 将无符号长数组作为 uint[] 从 C dll 返回到 C# 为什么抛出 MarshalDirectiveException 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14013920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com