0

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

4

2 回答 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; }
};

请参阅本机 C++ 的 C++/CLI 包装器以在 C# 中用作参考

于 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_asMicrosoft 为此目的提供的类。在此处查看 ildjarn 的答案:C++/CLI 字符串转换

于 2013-03-19T17:31:00.433 回答