1

C# コードからアンマネージ C 関数を呼び出したいのですが、呼び出し自体は正常に機能しますが、C# コードへのコールバックを作成する必要があります。C++ で次のシグネチャを持つ関数があります。

SRes Read(void *p, void *buf, size_t *size);

対応するデリゲートを次のように記述しました。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int StreamRead(IntPtr ptr, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] buffer, ref int bytes);

System.AccessViolationException残念ながら、コールバックを実行しようとすると、アプリケーションがクラッシュします ( )。パラメータは妥当に見えますが、考えられる唯一の問題は、配列のサイズが正しく読み取られていないことです。上記のマーシャリング仕様では、配列のサイズはまたはから読み取られますsize*size? 前者の場合、後者に変更するにはどうすればよいですか?これがクラッシュの原因でない場合、他に何が問題になっているのでしょうか? 属性を削除した後MarshalAs、呼び出しは成功しますが、配列のサイズは 1 です。

4

1 に答える 1

0

より良いものを期待していましたが、次の回避策は問題なく機能します。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int StreamRead(IntPtr ptr, byte* buffer, int* bytes);

byte[] で動作させる方法を知っている場合は、共有してください。

于 2012-12-21T09:59:27.717 に答える