C ライブラリの内部スレッドから呼び出されるコールバック関数を持つアンマネージ C ライブラリを使用しています。コールバックには void * 'context' パラメータがあります。
このコンテキストを C# クラス インスタンスのアドレスに設定して、コールバックからメンバー フィールドとプロパティにアクセスできるようにします。
私の理解では、C コードはインスタンスのアドレスのコピーを取得するため、GC がメモリを移動しないようにクラスのメモリを固定する必要があるということです。ただし、GCHandle.Alloc() は次のように述べています。
そして、クラス型のフィールドを含むクラスまたは構造体を固定しようとする十分なコードが実行時に失敗することを確認してください。
C# クラス インスタンスのアドレスを C++ コードに渡し、そのアドレスが有効なままであること (つまり、GC によって移動されないこと) を保証するにはどうすればよいですか?
EDIT #1 修正: ライブラリは C ライブラリであり、前述の C++ ではありません (上記のテキストで修正)。それが違いを生むべきではないということではありません。
これは C コールバックのプロトタイプです。
void Callback(uint32_t hCamera, uint32_t dwInterruptMask, void *pvParams);
そしてC#でラップ:
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public unsafe delegate void PHX_AcquireCallBack(uint hCamera, uint dwInterruptMask,
IntPtr pvParams);
pvParams
コールバックがインストールされると、C ライブラリに渡されます。ライブラリはポインタを格納しますが、アクセスしようとはしません。コールバックを呼び出すたびに、それを返すだけです。
C++ コードからライブラリを使用する場合、通常this
はpvParams
.