Visual c++ 从非托管类函数创建托管对象

Visual c++ 从非托管类函数创建托管对象,visual-c++,c++-cli,Visual C++,C++ Cli,我试图在非托管代码中创建托管C++/CLI对象 这可能吗 如果是,我做得对吗?请参阅下面的代码 #include <vcclr.h> #include <ManagedClass.h> // compiled with /clr namespace X { class UnmanagedClass { UnmanagedClass(){} ~UnmanagedClass(){} gcroot<Y:

我试图在非托管代码中创建托管C++/CLI对象

  • 这可能吗
  • 如果是,我做得对吗?请参阅下面的代码

    #include <vcclr.h>
    #include <ManagedClass.h>
    
    // compiled with /clr
    namespace X 
    {
        class UnmanagedClass
        {
            UnmanagedClass(){}
            ~UnmanagedClass(){}
    
            gcroot<Y::ManagedClass^> m_guiControl;
    
            void functionA()
            {
                 m_guiControl = new gcroot<Y::ManagedClass^>;
            }
        }
    }
    
    // compiled into Managed dll with /clr
    // in file ManagedClass.h in a separate project
    using namespace System::ComponentModel;
    // more usings here ..etc
    
    namespace Y {
        public ref class ManagedClass : public System::Windows::Forms::UserControl
        {
            // implementation here
    
        }
    }
    
    #包括
    #包括
    //使用/clr编译
    名称空间X
    {
    类非托管类
    {
    非托管类(){}
    ~UnmanagedClass(){}
    gcroot m_guiControl;
    无效函数()
    {
    m_guiControl=新的gcroot;
    }
    }
    }
    //使用/clr编译到托管dll中
    //在单独项目的ManagedClass.h文件中
    使用名称空间System::ComponentModel;
    //这里有更多的用法……等等
    名称空间Y{
    public ref类ManagedClass:public System::Windows::Forms::UserControl
    {
    //在这里实现
    }
    }
    
  • 当我编译
    非托管类
    源文件时,我不断收到大量错误,第一个错误是
    错误C2039:“ComponentModel”:不是“System”的成员
    。为什么它不能识别
    组件模型


    我以为这应该是IJW(它只是工作);-)

    以下是包装器的示例:

    class UnmanagedClass
    {
        gcroot<ManagedClass^> m_managed;
    
    public:
        UnmanagedClass() 
        {
           m_managed = gcnew ManagedClass();
        }
    };
    
    类非托管类
    {
    GCM_管理;
    公众:
    非托管类()
    {
    m_managed=gcnew ManagedClass();
    }
    };
    
    看这里:

    编辑

    当您在using语句中遇到错误,并且您知道它应该存在时,通常是因为该dll未被引用

    转到项目引用,选择添加引用


    您可以在.Net选项卡中添加.Net程序集。找到您需要的一个并添加它。

    下面是一个包装器示例:

    class UnmanagedClass
    {
        gcroot<ManagedClass^> m_managed;
    
    public:
        UnmanagedClass() 
        {
           m_managed = gcnew ManagedClass();
        }
    };
    
    类非托管类
    {
    GCM_管理;
    公众:
    非托管类()
    {
    m_managed=gcnew ManagedClass();
    }
    };
    
    看这里:

    编辑

    当您在using语句中遇到错误,并且您知道它应该存在时,通常是因为该dll未被引用

    转到项目引用,选择添加引用


    您可以在.Net选项卡中添加.Net程序集。找到你需要的,然后添加它。

    更新的问题-它仍然不起作用,它似乎不承认托管C++对象中的所有使用语句。您需要为VC++项目添加对相应.NET程序集的引用。耶!谢谢马吕斯,这就是我一直在寻找的答案。与C++的.NET一样,只是我不知道如何为C++项目做这件事。你应该把它作为一个答案。更新的问题-它仍然不起作用,它似乎没有认识到所有的使用管理的C++对象的语句。这是不够的,添加使用指令。您需要为VC++项目添加对相应.NET程序集的引用。耶!谢谢马吕斯,这就是我一直在寻找的答案。与C++的.NET一样,只是我不知道如何为C++项目做这件事。你应该把它记下来作为回答。