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

时间:2010-10-26 16:55:36

标签: c++-cli

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

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

无论如何以我正在尝试的方式之一完成它,或者我应该声明非托管结果对象在非托管事件中填充它们然后马歇尔吗?

修改

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

建议的同一行搜索时找到了这个

1 个答案:

答案 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
    }
};