2011-09-19 69 views
0

我有一个托管程序,它与非托管DLL库配合使用。在托管代码中填充非托管数组

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

让回调具有以下原型:

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

让代表有下列原型:

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

你可以分享回调的签名吗? –

+0

按要求添加了回拨签名。 – Spook

+0

什么是PInvoke等价物;你正在使用? –

回答

2

如果你想没有不安全的代码,那么你就必须让PInvoke的编组复制数组。声明这样的代表类型:

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

确保存储委托对象,以便它不能被垃圾收集。

0

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

+0

我正在这样做。问题是,如何将数组从非托管代码传递到托管,以便托管可以用数据填充数据。 – Spook