您可以创建一个在 CLR 上运行的 VC++ Windows 窗体项目,该项目本质上是一个用 C++ 编写的 .NET 应用程序。您可以直接从此类项目中使用非托管 C++ 库吗?这是否意味着该库必须在 .NET 下编译和运行?或者您必须为此类库编写CLR 包装类,并且只有那些可以从 CLR 应用程序中使用?
问问题
755 次
2 回答
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; }
};
于 2013-03-19T17:09:40.573 回答
1
使用智能指针库可以更简单地管理本机(非垃圾收集)对象的分配,这在存在异常、多次调用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();
}
};
对于字符串转换,请使用marshal_as
Microsoft 为此目的提供的类。在此处查看 ildjarn 的答案:C++/CLI 字符串转换
于 2013-03-19T17:31:00.433 回答