【问题标题】:How can I use unmanaged class in managed class?如何在托管类中使用非托管类?
【发布时间】:2015-07-29 06:13:38
【问题描述】:

我正在尝试将 cv::CascadeClassifier 对象放入 System.Windows.Forms.Form 类中。

Intellisense 和编译器说,我不能在托管类中包含非托管类。

那么,如何在我的 Windows 窗体应用程序中使用该非托管类?

【问题讨论】:

    标签: c++ .net winforms opencv visual-c++


    【解决方案1】:

    嗯,你的编译器是正确的。但是,您可以拥有一个指向非托管类型的 指针 作为成员。这不是最佳的,但它就是你所拥有的。如果需要,您可以使用构造函数和析构函数进行分配和清理。

    【讨论】:

    • Sooo... 我可以在 MainForm_Shown 事件处理程序中创建 cv::CascadeClassifier* haar; 并创建这样的对象:haar = new cv::CascadeClassifier; 在 MainForm_Shown 事件处理程序中,只是在 MainForm_Closed 事件处理程序中创建 delete haar?或者我必须为此使用构造函数和析构函数?
    • 虽然您可以与非托管内存块进行交互,但.NET 将无法在非托管对象上调用 任何成员,除非它被标记为 ref跨度>
    【解决方案2】:

    here 是来自 MSDN 的一些示例代码。它与 Ed S. 的回答一致

    U 中的 this 指针是一个 __nogc 指针,所以如果不先钉住 M 就不能调用 f。

    示例(来自同一页面)

    // mcpp_nested_classes5.cpp
    // compile with: /clr /LD
    #using <mscorlib.dll>
    
    __gc struct M {
       __nogc struct U {   // nested unmanaged class
          int m_data;
          U() { System::Console::WriteLine("U::U"); }
          void f() { int* p = &m_data; }
       };
    
       int ia __nogc[100]; // embedded unmanaged array
    };
    
    M::U u; // use unmanaged nested type
    

    【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多