gcroot没有价值

时间:2011-06-28 12:24:57

标签: exception visual-c++ c++-cli handle mixed-mode

我对非托管代码中的托管对象有一个奇怪的问题。我有这个C ++ / CLI模块,它连接C ++和C#代码。我有这样的结构:

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

现在,我在某个时候创建​​了这个托管引用的实例并设置了addonHost。一切都很好,我可以使用手柄。

enter image description here

但是,在某些情况下(我担心需要很多上下文描述)无法评估该值:

enter image description here

在这种情况下,使用addonHost调用方法会导致“找到的入口点”异常。

从截图中可以看出,它不是两个不同的实例,两个不同的句柄。它是一样的。我不明白在某些情况下如何评估“价值”。也许我怎么能抓住它。因为它不是空的。

我还应该提到的是,我有几个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'

1 个答案:

答案 0 :(得分:0)

也许有助于初始化gcroot。尝试:

template <class T>
struct ManagedReference
{
  gcroot<T^> addonHost;
  ManagedReference() : addonHost(nullptr) {}
};