首页 > 解决方案 > MarshalAs 是否会导致数组副本?

问题描述

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

AC 函数负责将数据传递给 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。

标签: c#pinvokemarshalling

解决方案


应该被固定,根据Does .NET interop copy array data来回,还是固定数组?.

虽然这似乎并没有很好的记录或定义,所以如果我是你,我会明确地固定它,以确保安全。


推荐阅读