2011-06-28 76 views
0

我对非托管代码中的托管对象有一个好奇的问题。我有这个桥接C++和C#代码的C++/CLI模块。我有这样的结构:gcroot没有任何价值

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

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

enter image description here

然而,在某些情况下(将需要多情境的描述恐怕)的值不能评价:

enter image description here

在这种情况下,调用与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' 
+0

这是什么样的gcroot <>类?微软拥有一个“手柄”,而不是一个手柄,也没有任何价值。 –

+0

可能存在调试器无法读取值的某些对象类型(编译过的优化过的本机对象,调试器无法正确识别的本地对象),您是否检查过这些? –

+0

@hans,它是微软的'gcroot'。是的,它有一个_handle,但是你可以从屏幕截图中看到调试器显示一个“句柄”和“值”。当然你也可以自己试试 –

回答

0

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

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

只是为了开放想法,我已经尝试过,但当然没有任何帮助。'addonHost'在创建实例后立即初始化,并且在大多数情况下我可以使用它的值。 –

+0

@Marius:所以你期待'pInstance-> addonHost'应该总是正确设置(在if语句中应该总是评估为true)? –

+0

是的,因为,你看,在初始化之后,这段代码被多次调用,并且在某些情况下,这个值不是“找到”的(我不知道该如何放置它)。但在此之后的下一个电话,它再次运作 –