在托管代码中填充非托管数组

时间:2011-09-19 11:18:35

标签: c# .net arrays managed unmanaged-memory

我有一个托管程序,它与非托管DLL库合作。

库构造一个对象,它要求(通过回调函数转换为委托)托管主机来填充非托管数组。数组本身通过指针(IntPtr)传递,并提供有关其大小的信息。这种类型是双方都知道的。关键是,如何使用托管代码中的数据安全填充非托管数组?有两个限制:没有不安全的代码,最好不要创建其他数组。如果存在,则可能以另一种方式传递数组。

让回调具有以下原型:

typedef void (__stdcall * FillData)(double * array, int count);

让代表拥有以下原型:

protected delegate void FillData(IntPtr array, int count);

2 个答案:

答案 0 :(得分:2)

如果你不想要不安全的代码,那么你必须让pinvoke marshaller复制数组。声明委托类型如下:

private delegate MyUnmanagedCallback(
     [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double[] array,
     int count);

请务必存储委托对象,以便无法进行垃圾回收。

答案 1 :(得分:0)

根据您的FillData原型编写托管回调。使用Marshal.GetFunctionPointerForDelegate方法从中创建非托管函数指针。将其作为回调函数指针传递给非托管代码。