0

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

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

让回调具有以下原型:

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

让委托具有以下原型:

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

2 回答 2

2

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

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

请务必存储委托对象,使其不会被垃圾收集。

于 2011-09-19T11:47:51.670 回答
0

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

于 2011-09-19T11:52:30.580 回答