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 です。