能否在c++ /CLI WinForms应用程序中本地使用c++库?
本文关键字:c++ 应用程序 CLI WinForms | 更新日期: 2023-09-27 18:04:38
你可以创建一个运行在CLR上的vc++ Windows Forms项目,CLR本质上是一个用c++编写的。net应用程序。您可以直接从这样的项目中使用非托管c++库吗?这是否意味着库必须在。net下编译和运行?或者必须为这些库编写CLR包装器类,并且只有这些类才能从CLR应用程序中使用?
是。这里有一些指南。混合CLI/c++和本地代码。在CLI/c++中使用它们不需要包装器。实际上,您可以使用CLI/c++和本机代码来创建包装器。
http://www.technical-recipes.com/2012/mixing-managed-and-native-types-in-c-cli/http://www.codeproject.com/Articles/35041/Mixing-NET-and-native-code如果你真的想在c#中使用一个包装器,它应该看起来像这样:
#include "NativeClass.h"
public ref class NativeClassWrapper {
NativeClass* m_nativeClass;
public:
NativeClassWrapper() { m_nativeClass = new NativeClass(); }
~NativeClassWrapper() { delete m_nativeClass; }
void Method() {
m_nativeClass->Method();
}
protected:
// an explicit Finalize() method—as a failsafe
!NativeClassWrapper() { delete m_nativeClass; }
};
在c#
使用智能指针库可以更简单地管理本机(不是垃圾收集)对象的分配,这在存在异常,多次调用Dispose()
,忘记调用Dispose()
等情况下非常困难。
下面是Dr_Asik的例子,重写为使用智能指针:
#include "clr_scoped_ptr.h"
#include "NativeClass.h"
public ref class NativeClassWrapper {
clr_scoped_ptr<NativeClass> m_nativeClass;
public:
NativeClassWrapper() m_nativeClass(new NativeClass()) {}
// auto-generated destructor is correct
// auto-generated finalizer is correct
void Method() {
m_nativeClass->Method();
}
};
对于字符串转换,使用Microsoft提供的marshal_as
类。查看ildjarn的答案:c++/CLI字符串转换