无法在非托管代码错误c3265,c2811中使用托管事件/对象

ani*_*vas 4 c++-cli

我在C++/CLI项目中使用的本机C++库引发了给我结果的事件,

  • 如果我尝试通过扩展非托管事件来处理事件,则表示ref类只能扩展ref类.
  • 然后我尝试创建一个本机事件,但在其中有manged对象来收集结果,但是我得到的错误无法在非托管类中声明托管对象.

反正是以我尝试的方式完成它,或者我应该声明非托管结果对象在非托管事件中填充它们然后马歇尔呢?

编辑:

class MyNativeListener: public NativeEventListener
{ 
private:
    ManagedResultsObject ^_results;
public:

void onEndProcessing(ProcessingEvent *event) 
{
    _results.Value = event->value;
      //Many more properties to capture

}

};
Run Code Online (Sandbox Code Playgroud)

这就是我正在尝试的,我已经扩展了本机事件侦听器来捕获事件,但不确定如何将结果捕获到托管对象.

Edit2 在@mcdave auto_gcroot建议的同一行搜索时找到了这个

mcd*_*ave 18

您的本机类需要存储托管对象的句柄而不是对它的引用.您可以使用gcroot模板执行此操作.如果你深入了解gcroot模板,你会发现它使用GCHandle结构,它可以将适当的静态转换存储为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
    }
};
Run Code Online (Sandbox Code Playgroud)