你能在C ++ / CLI WinForms应用程序中原生使用C ++库吗?

时间:2013-03-19 17:06:18

标签: c# .net visual-c++

您可以创建在CLR上运行的VC ++ Windows窗体项目,该项目本质上是一个用C ++编写的.NET应用程序。您可以直接从这样的项目中使用非托管C ++库吗?这是否意味着库必须在.NET下编译和运行?或者你必须为这些库编写CLR wrapper classes,只有那些可以在CLR应用程序中使用吗?

2 个答案:

答案 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; }
};

请参阅C++/CLI wrapper for native C++ to use as reference in C#

答案 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