我在C ++ / CLI项目中使用的本机C ++库引发了给我结果的事件,
无论如何以我正在尝试的方式之一完成它,或者我应该声明非托管结果对象在非托管事件中填充它们然后马歇尔吗?
修改
class MyNativeListener: public NativeEventListener
{
private:
ManagedResultsObject ^_results;
public:
void onEndProcessing(ProcessingEvent *event)
{
_results.Value = event->value;
//Many more properties to capture
}
};
这就是我正在尝试的,我已经扩展了本机事件侦听器以捕获事件,但不确定如何将结果捕获到托管对象。
EDIT2 在@mcdave auto_gcroot
建议的同一行搜索时找到了这个答案 0 :(得分:18)
您的本机类需要存储托管对象的句柄而不是对它的引用。您可以使用gcroot template执行此操作。如果你深入了解gcroot模板,你会发现它使用GCHandle Structure,它具有适当的静态转换,可以存储为void*
指针,因此提供了一种在本机代码中存储托管引用的方法。
尝试按以下方式扩展您的代码:
#include <vcclr.h>
class MyNativeListener: public NativeEventListener
{
private:
gcroot<ManagedResultsObject^> _results;
public:
void onEndProcessing(ProcessingEvent *event)
{
_results->Value = event->value;
//Many more properties to capture
}
};