2011-12-04 12 views
8

私は作成しているアプリケーションにモノを埋め込むことに取り組んでいますが、私は遠くにスーパーを手に入れることはできませんでした。私がオブジェクトを使用しているときにモノを伝え、オブジェクトで終わる方法。埋め込みモノ:C++のC#オブジェクトへの参照を維持する

C#での並列オブジェクトの存続期間が終わるまで、メソッドを呼び出すためのC#オブジェクトへの参照を保持したいと思います。その時点で、C#オブジェクトが安全に収集できることをモノに伝えたいと思います。

これはどのように達成されましたか?

+0

Microsoftの.NET実装では['gcroot'](http://msdn.microsoft.com/en-us/library/481fa11f(VS.80).aspx)を知っていますが、これはモノのために存在します。私は、この管理されたネイティブインターフェイスが移植性があるとは思わない。 –

+0

私は同じ問題を抱えていました。管理対象側に静的フィールドを設定してオブジェクトを割り当てたため、Gcが収集されないようにオブジェクトを割り当てました。 –

答えて

3

私が探しているのはmono_gchandle_newで、MonoObject *ではなくハンドルを持っていて、必要なときにmono_gchandle_get_targetを使用しているようです。

mono_gchandle_newは、ハンドルの作成時に固定することができますが、事実の後にピンで固定することは可能ですか?

+1

事実の後ろにピン止めすることはできませんが、ピンチされた新しいジャンチャルを作成することはできます。 –

+0

よろしくお願いします。ありがとう。 – Jeff

0

私が遭遇したmono_gchandle_new()を使用する際に注意しなければならないことは、メモリ内で参照しているC#オブジェクトのみを保持しますが、そのオブジェクトがガベージコレクションルーチンの対象です。あなたがハンドルを持っているオブジェクトが、あなたのサブオブジェクトを解放することができるという事実は、私にかなり問題を引き起こしました。

私は現在、モノGCシステムを掘り下げて修正できるかどうか調べて、それらのオブジェクトをルートオブジェクトとして扱うようにしています。

オブジェクト数が十分でない場合(< 4096)、mono_gc_register_root()を使うことができます。何千ものオブジェクトを持つことができますので、私たちの用途には適していません。

更新:私はこれについて間違っていました。私たちはモノオブジェクト割り当てシステムに夢中になり、GCアロケーション関数に「アトミック」変数を正しく渡していませんでした。 「アトミック」とはGCとは異なる意味であり、同時アクセスとは関係ありません。実際には割り当てられているメモリが他のオブジェクト(アトミック= 0)またはアトミック(アトミック= 1)を参照していることを意味します。

+0

それは...変だ。 Microsoftのバージョン 'clr :: gcroot'は、' System :: GCHandle'を覆う薄いラッパーです。 'System :: GCHandle'は間違いなくルートとして機能し、そこから直接的または間接的に到達可能なすべてのオブジェクトを保護します。それが動作しない場合は、単に 'System :: GCHandle'の数値を使用しますか? –

+0

はい、それは奇妙です。私たちはたぶん正直に使用されていない方法でモノを使用しようとしています。私はC#オブジェクトをC++オブジェクトでラップし、社内反射システムを使用してC++からモノラルデータにアクセスしました。私はこれがモノでGCシステムを混乱させていると思いますので、塩の粒で上記の私のコメントを取る。 –

0

System::GCHandle::Allocを使用し、ToIntPtrを呼び出してトークンを取得し、コレクションからオブジェクトを保護します。 ToPointer()に電話し、void*として保存してください。

トークンをオブジェクトにマップする必要がある場合は、System::GCHandle::FromIntPtrを使用するか、オブジェクトを再びコレクションに適用できるように解放します。

関連する問題