2011-07-31 19 views
11

管理されていないコードが自分の関数を呼び出します。最初の関数では、管理対象オブジェクトにポインタを戻す必要があります。ときどき後で他の関数のいくつかが同じポインタをパラメータの一つとして呼び出されます。私はそれを逆参照して、それをいくつかの計算を実行するために使用し、それからそれを処分する必要がない場合は使用しなければなりません。 ストーリーを短くするには、オブジェクトを固定して、GCを処分するまで移動させないようにする必要があります。どのようにC#でそれを行うには? ありがとうございます。C#で管理対象オブジェクトへのポインタをピン止めする方法は?

+2

いくつかのコードを投稿してください。好ましくは、* minimal、complete *の例です。 –

+1

ピン止めしないでください。アンマネージコードはポインタのための使用を持っていません。だから、ポインタを渡さず、 'ハンドル'を渡してください。静的なList <>のインデックス。これでハンドル値からコールバック内のマネージリファレンスを取り出すことができます。 –

答えて

10

オブジェクトをC#で固定するには、メソッドを第2パラメータGCHandleType.Pinnedで使用できます。オブジェクトはGCHandleのインスタンスが解放されるまで固定されたままで、GCHandle.Freeメソッドを使用します。

+0

GCHandleはオブジェクトがblittableではないため動作しません – apaka

+0

GCHandle.Aloc(オブジェクト値)を使用してIntPtrにキャストしたときのように機能します。 – apaka

+1

@apaka:GCHandle.Alloc(object_value、GCHandleType.Pinned)+ GCHandle.AddrOfPinnedObject。 –

関連する問題