我有一个托管程序,它与非托管DLL库合作。
库构造一个对象,它要求(通过回调函数转换为委托)托管主机来填充非托管数组。数组本身通过指针(IntPtr)传递,并提供有关其大小的信息。这种类型是双方都知道的。关键是,如何使用托管代码中的数据安全填充非托管数组?有两个限制:没有不安全的代码,最好不要创建其他数组。如果存在,则可能以另一种方式传递数组。
让回调具有以下原型:
typedef void (__stdcall * FillData)(double * array, int count);
让代表拥有以下原型:
protected delegate void FillData(IntPtr array, int count);
答案 0 :(得分:2)
如果你不想要不安全的代码,那么你必须让pinvoke marshaller复制数组。声明委托类型如下:
private delegate MyUnmanagedCallback(
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double[] array,
int count);
请务必存储委托对象,以便无法进行垃圾回收。
答案 1 :(得分:0)
根据您的FillData原型编写托管回调。使用Marshal.GetFunctionPointerForDelegate方法从中创建非托管函数指针。将其作为回调函数指针传递给非托管代码。