如何在托管类中使用非托管类?
Posted
技术标签:
【中文标题】如何在托管类中使用非托管类?【英文标题】:How can I use unmanaged class in managed class? 【发布时间】:2015-07-29 06:13:38 【问题描述】:我正在尝试将 cv::CascadeClassifier
对象放入 System.Windows.Forms.Form
类中。
Intellisense 和编译器说,我不能在托管类中包含非托管类。
那么,如何在我的 Windows 窗体应用程序中使用该非托管类?
【问题讨论】:
【参考方案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
【讨论】:
我应该把这个放在哪里?我在__gc struct
上出现“此声明没有存储类或类型说明符”错误。
__gc
语法在很久以前被ref
取代(VS2005)。大多数其他双下划线也被删除。 The double underscore in front of all keywords has been removed以上是关于如何在托管类中使用非托管类?的主要内容,如果未能解决你的问题,请参考以下文章
如何防止相同的非托管指针被封装在两个不同的 SafeHandles 中?