您可以创建在CLR上运行的VC ++ Windows窗体项目,该项目本质上是一个用C ++编写的.NET应用程序。您可以直接从这样的项目中使用非托管C ++库吗?这是否意味着库必须在.NET下编译和运行?或者你必须为这些库编写CLR wrapper classes,只有那些可以在CLR应用程序中使用吗?
答案 0 :(得分:1)
是。这是一些指南。混合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; }
};
答案 1 :(得分:1)
使用智能指针库可以更轻松地管理本机(非垃圾收集)对象的分配,这在出现异常,多次调用Dispose()
,忘记调用Dispose()
时非常困难等等。
这是Dr_Asik的例子,改写为使用a smart pointer I wrote:
#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 String Conversions