我有一个处理相当大的数组的项目。有些代码是用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。
答案 0 :(得分:0)
应该应该固定。
尽管这似乎并没有得到很好的记录或定义,但是为了安全起见,如果我是我,我会明确将其固定。