我在 C++/CLI 项目中使用的 native C++ 库引发了给我结果的事件,
无论如何以我正在尝试的方式之一完成它,或者我应该声明非托管结果对象将它们填充到非托管事件中然后Marshall它?
编辑:
class MyNativeListener: public NativeEventListener
{
private:
ManagedResultsObject ^_results;
public:
void onEndProcessing(ProcessingEvent *event)
{
_results.Value = event->value;
//Many more properties to capture
}
};
这就是我正在尝试的,我扩展了 native 事件监听器以捕获事件,但不确定如何将结果捕获到托管对象。
编辑 2
在@mcdave auto_gcroot 建议的同一行上搜索时发现了这一点
最佳答案
您的 native 类需要存储托管对象的句柄而不是对它的引用。您可以使用 gcroot template 执行此操作.如果您深入研究 gcroot 模板,您会发现它使用了 GCHandle Structure ,通过适当的静态转换可以存储为 void*
指针等提供了一种在 native 代码中存储托管引用的方法。
尝试按照以下几行扩展您的代码:
#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
}
};
关于c++-cli - 无法在非托管代码错误 c3265、c2811 中使用托管事件/对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4025967/