我对非托管代码中的托管对象有一个奇怪的问题。我有这个桥接 C++ 和 C# 代码的 C++/CLI 模块。我有这样的结构:
template <class T>
struct ManagedReference
{
gcroot<T^> addonHost;
}
现在,在某个时候,我创建了这个托管引用的一个实例并设置了 addonHost。一切都很好,我可以使用手柄。
但是,在某些情况下(恐怕需要很多上下文描述)该值无法评估:
在这种情况下,使用 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'