2011-09-19 66 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