1

アンマネージ コード内のマネージ オブジェクトに奇妙な問題があります。C++ と C# コードを橋渡しするこの C++/CLI モジュールがあります。私はこのような構造を持っています:

template <class T>
struct ManagedReference
{
  gcroot<T^> addonHost;
}

ここで、ある時点で、このマネージド参照のインスタンスを作成し、addonHost を設定します。無事、ハンドルも使えるようになりました。

ここに画像の説明を入力

ただし、場合によっては (多くの文脈上の説明が必要になるのではないかと思います)、値を評価できません。

ここに画像の説明を入力

この場合、addonHost を指定してメソッドを呼び出すと、「Entry point for found」例外が発生します。

スクリーンショットからわかるように、2 つの異なるインスタンス、2 つの異なるハンドルではありません。まったく同じです。「値」が評価されない状況がどのように発生するのかわかりません。そして、どうやってそれを捕まえたのかもしれません。nullではないからです。

私が言及しなければならないことは、私はいくつか持っていてgcroot<T>、すべてがこの問題を抱えているということですgcroot<System::String>

アップデート

実行中にデバッガーが表示するものを次に示します。オブジェクトが作成されて利用可能になり、ある時点で値が「消失」し、次の呼び出しではまだ存在しています。しかし、これは非常に再現性があります。ランダムではありません。

handle  0x0E1618EC  void*
 value  0x106396d8 { m_host=0x10638e04 }    <-- object is available here

handle  0x0E1618EC  void*
 value  0x1020e558 { m_host=0x1020e4f0 }    <-- object moved in memory

handle  0x0E1618EC  void*
 value                                      <-- no value here

handle  0x0E1618EC  void*
 value  0x1020e558 { m_host=0x1020e4f0 }    <-- object 'is back'
4

1 に答える 1

0

たぶん、初期化するのに役立つでしょうgcroot。試す:

template <class T>
struct ManagedReference
{
  gcroot<T^> addonHost;
  ManagedReference() : addonHost(nullptr) {}
};
于 2011-06-28T12:49:34.313 に答える