gpt4 book ai didi

c# - P/Invoke with arrays of double - 在 C# 和 C++ 之间编码数据

转载 作者:可可西里 更新时间:2023-11-01 18:27:22 24 4
gpt4 key购买 nike

我已经阅读了关于 C++ Interop with P/Invoke 的各种 MSDN 页面 herehere但我仍然很困惑。

我有一些大型 double 组需要进入 native 代码,还有一些结果数组需要返回。我事先不知道输出数组的大小。为简单起见,我将在示例中仅使用一个数组。平台是x64;我读到 32 位和 64 位环境之间的内部编码非常不同,因此这可能很重要。

C#

    [DllImport("NativeLib.dll")]
public static extern void ComputeSomething(double[] inputs, int inlen,
[Out] out IntPtr outputs, [Out] out int outlen);

[DllImport("NativeLib.dll")]
public static extern void FreeArray(IntPtr outputs);

public void Compute(double[] inputs, out double[] outputs)
{
IntPtr output_ptr;
int outlen;
ComputeSomething(inputs, inputs.Length, out output_ptr, out outlen);

outputs = new double[outlen];
Marshal.Copy(output_ptr, outputs, 0, outlen);

FreeArray(output_ptr);
}

C++

extern "C" 
{
void ComputeSomething(double* inputs, int input_length,
double** outputs, int* output_length)
{
//...
*output_length = ...;
*outputs = new double[output_length];
//...
}

void FreeArray(double* outputs)
{
delete[] outputs;
}
}

它起作用了,也就是说,我可以读出我在 C++ 端写入数组的 double 值。但是,我想知道:

  • 这真的是使用 P/Invoke 的正确方法吗?
  • 我的签名不是不必要地复杂吗?
  • 是否可以更有效地使用 P/Invoke 来解决这个问题?
  • 我相信我读到过可以避免对内置类型的一维数组进行编码。有没有办法绕过 Marshal.Copy?

请注意,我们有一个可用的 C++/Cli 版本,但第三方库代码中存在一些与本地静态相关的问题,这些问题会导致崩溃。 Microsoft marked this issue as WONTFIX ,这就是我寻找替代方案的原因。

最佳答案

没关系。完全没有返回错误代码的方法是非常糟糕的,当数组很大并且程序内存不足时,这会造成伤害。您遇到的严重崩溃是无法诊断的。

复制数组并显式释放它们的需要当然不会赢得任何奖励。您可以通过让调用者将指针传递给它自己的数组来解决这个问题,而您只需编写元素即可。但是,您需要一个协议(protocol)来让调用者确定数组需要多大,这将需要调用该方法两次。第一次调用返回所需的大小,第二次调用完成工作。

一个样板示例是:

[DllImport("foo.dll")]
private static int ReturnData(double[] data, ref int dataLength);

和示例用法:

int len = 0;
double[] data = null;
int err = ReturnData(data, ref len);
if (err == ERROR_MORE_DATA) { // NOTE: expected
data = new double[len];
err = ReturnData(data, len);
}

不用复制,不用释放内存,好东西。如果 native 代码不注意传递的 len,它可能会破坏 GC 堆,这可不是什么好事。但当然很容易避免。

关于c# - P/Invoke with arrays of double - 在 C# 和 C++ 之间编码数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138248/

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