能否在c++ /CLI WinForms应用程序中本地使用c++库?

本文关键字:c++ 应用程序 CLI WinForms | 更新日期: 2023-09-27 18:04:38

你可以创建一个运行在CLR上的vc++ Windows Forms项目,CLR本质上是一个用c++编写的。net应用程序。您可以直接从这样的项目中使用非托管c++库吗?这是否意味着库必须在。net下编译和运行?或者必须为这些库编写CLR包装器类,并且只有这些类才能从CLR应用程序中使用?

能否在c++ /CLI WinForms应用程序中本地使用c++库?

是。这里有一些指南。混合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#

中参考本地c++的c++/CLI包装器

使用智能指针库可以更简单地管理本机(不是垃圾收集)对象的分配,这在存在异常,多次调用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字符串转换