MarshalAs是否会导致数组副本?

时间:2019-01-04 22:19:57

标签: c# pinvoke marshalling

我有一个处理相当大的数组的项目。有些代码是用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;
}

最终,将从C调用to_call回调。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。

1 个答案:

答案 0 :(得分:0)

根据{{​​3}},

应该应该固定。

尽管这似乎并没有得到很好的记录或定义,但是为了安全起见,如果我是我,我会明确将其固定。