c# - 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。
解决方案
它应该被固定,根据Does .NET interop copy array data来回,还是固定数组?.
虽然这似乎并没有很好的记录或定义,所以如果我是你,我会明确地固定它,以确保安全。
推荐阅读
- excel - Laravel 不强制文件下载
- spring - HTML 页面未在 Spring Boot 中加载
- javascript - FS 不会保存到 JSON 文件
- sql - SQL Sylob 返回一个布尔值
- java - 在 java 类中出现错误
- html - How do I put a text on top blinking div
- c++ - 如何在 Windows 中使用 sys 标头(或找到它们的 MSVC 对应标头)?
- android - android:背景不适用于主题为 Theme.MaterialComponents.DayNight.DarkActionBar 的按钮
- scala - 在 spark scala 中获取 s3 目录的大小
- r - 如何在 NMDS 排序中绘制超过 2 个维度?