我对非托管代码中的托管对象有一个好奇的问题。我有这个桥接C++和C#代码的C++/CLI模块。我有这样的结构:gcroot没有任何价值
template <class T>
struct ManagedReference
{
gcroot<T^> addonHost;
}
现在,在某些时候,我创建了这个托管引用的实例并设置了addonHost。一切都很好,我可以使用手柄。
然而,在某些情况下(将需要多情境的描述恐怕)的值不能评价:
在这种情况下,调用与addonHost的方法导致“找到入口点”异常。
从截图中可以看出,它不是两个不同的实例,两个不同的句柄。这是一样的。我不明白在某些情况下如何评估“价值”。也许我可以怎么做到。因为它不是空的。
我还应该提及的是,我有几个gcroot<T>
,他们都有这个问题,除了一个是gcroot<System::String>
。
UPDATE
这是调试器在执行过程中显示的内容。该对象被创建并可用,然后在某个时间点,该值将“消失”,在下一次调用时它仍然存在。但这是非常可重复的。这不是随机的。
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'
这是什么样的gcroot <>类?微软拥有一个“手柄”,而不是一个手柄,也没有任何价值。 –
可能存在调试器无法读取值的某些对象类型(编译过的优化过的本机对象,调试器无法正确识别的本地对象),您是否检查过这些? –
@hans,它是微软的'gcroot'。是的,它有一个_handle,但是你可以从屏幕截图中看到调试器显示一个“句柄”和“值”。当然你也可以自己试试 –