c++-cli - 无法在非托管代码错误 c3265、c2811 中使用托管事件/对象

标签 c++-cli

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

  • 如果我尝试通过扩展非托管事件来处理该事件,它表示 ref 类只能扩展 ref 类。
  • 然后我尝试创建一个 native 事件,但在其中包含管理对象以收集结果,但我收到错误消息,无法在非托管类中声明托管对象。

  • 无论如何以我正在尝试的方式之一完成它,或者我应该声明非托管结果对象将它们填充到非托管事件中然后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/

    相关文章:

    C++/CLI 应用程序无法启动

    c# - 为什么我的字节在加密算法的这个 C# 端口的第四轮不同?

    c# - pin_ptr 无法在非托管类中声明托管对象

    c - 非托管结构作为托管的返回值

    delphi - 使用许多参数从 C++\CLI 调用 Delphi DLL

    msbuild - 如何在 C++/CLI 项目中使用代码契约?

    c++ - 在Windows窗体c++/cli程序中为已定义的标识符获取未定义的标识符错误

    .net - 什么是 "verifiable managed assembly"

    .net - C++/CLI 自动包装器生成器

    boost - C++/Cli : Could not load file or assembly X or one of its dependencies. 不是有效的 Win32 应用程序。 (来自 HRESULT 的异常:0x800700C1)