アンマネージ コード内のマネージ オブジェクトに奇妙な問題があります。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'