gpt4 book ai didi

c# - MarshalAs 是否会生成数组副本?

转载 作者:行者123 更新时间:2023-12-05 07:27:09 25 4
gpt4 key购买 nike

我有一个项目可以处理相当大的数组。有些代码是用C写的,有些是用C#写的。为了将数据从 C 传递到 C#,我使用了 MarshalAs 属性。由于数组很大,我宁愿避免复制。所以我的问题是: MarshalAs 会导致数据从 C 复制到 C#,还是 C# byte[] 会引用 C 分配的完全相同的位置?

C 函数负责将数据传递给 C#,这意味着我使用回调。回调看起来像这样:

void (*to_call)(const uint8_t* buffer, int buffer_length);

DLLEXPORT
init(void(*callback)(const uint8_t* buffer, int buffer_length))
{
to_call = callback;
}

最终,to_call 回调将从 C 调用。C# 代码如下所示:

public delegate void Callback([In][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]byte[] buffer, int bufferLength);

[DllImport(DLLPath)]
public static extern void init(Callback callback);

我还想知道答案如何适用于 .Net Framework 和 .Net Core。

最佳答案

根据 Does .NET interop copy array data back and forth, or does it pin the array?,它应该被固定.

尽管这似乎没有很好的记录或定义,所以如果我是你,为了安全起见,我会明确地固定它。

关于c# - MarshalAs 是否会生成数组副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54046931/

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