0

アンマネージDLLライブラリと連携するマネージプログラムがあります。

ライブラリはオブジェクトを構築します。オブジェクトは、(コールバック関数によってデリゲートに変換されて)管理対象ホストに管理対象外の配列を埋めるように要求します。配列自体は、そのサイズに関する情報とともにポインター(IntPtr)を介して渡されます。タイプは両側に知られています。重要なのは、マネージコードのデータでアンマネージ配列を安全に埋めるにはどうすればよいのでしょうか。2つの制限が適用されます。安全でないコードがないことと、できれば追加の配列が作成されないことです。そのようなものが存在する場合、配列は別の方法で渡される可能性があります。

コールバックに次のプロトタイプを持たせます。

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

デリゲートに次のプロトタイプを持たせます。

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

2 に答える 2

2

安全でないコードが必要ない場合は、pinvokeマーシャラーに配列をコピーさせる必要があります。次のようにデリゲートタイプを宣言します。

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 に答える