gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:10:12 25 4
gpt4 key购买 nike

我在 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com