C# C++/本机C++;在C中用作参考#

C# C++/本机C++;在C中用作参考#,c#,c++,dll,c++-cli,C#,C++,Dll,C++ Cli,标题解释。我有C++的原生C++ DLL,我将用C++语言编写CLI包装器,这将以C语言作为参考。 问题是在C#中,我看不到包装器(从DLL导入)中的类 我应该使用什么关键字以及如何在C语言中重新声明我的本机C++对象成为可见的?< /P> < P> OK,教程。你有一个C++类 NativeClass ,你想暴露给C。 1) 创建一个C++/CLI项目。链接到C++库和头文件。 2) 创建一个公开所需方法的包装器类。例如: #include "NativeClass.h" public re

标题解释。我有C++的原生C++ DLL,我将用C++语言编写CLI包装器,这将以C语言作为参考。 问题是在C#中,我看不到包装器(从DLL导入)中的类


我应该使用什么关键字以及如何在C语言中重新声明我的本机C++对象成为可见的?< /P> < P> OK,教程。你有一个C++类<代码> NativeClass <代码>,你想暴露给C。 1) 创建一个C++/CLI项目。链接到C++库和头文件。 2) 创建一个公开所需方法的包装器类。例如:

#include "NativeClass.h"

public ref class NativeClassWrapper {
    NativeClass* m_nativeClass;

public:
    NativeClassWrapper() { m_nativeClass = new NativeClass(); }
    ~NativeClassWrapper() { this->!NativeClassWrapper(); }
    !NativeClassWrapper() { delete m_nativeClass; }
    void Method() {
        m_nativeClass->Method();
    }
};
3) 在C#项目中添加对C++/CLI项目的引用

4) 在using语句中使用包装类型

using (var nativeObject = new NativeClassWrapper()) {
    nativeObject.Method();
}

using语句确保调用Dispose(),它会立即运行析构函数并销毁本机对象。否则,您将有内存泄漏,可能会可怕地死去(而不是您,程序)。注意:。

包装类是公共的吗?声明应该是“public ref class{…}”;我知道这一点。我要问的是这样一件事是可能的:
public-ref-class-wrapper\u-class=native\u-class?这种方法可能吗?没那么简单。包装器类将承载一个本机\u类对象,并为要公开的本机\u类的所有方法创建包装器方法。包装器方法只是封送参数并将调用委托给本机类对象?导致最小开销或重定向成员函数调用的方法?如果您能够以某种方式将类功能公开为C函数,那么您可以使用P/Invoke。否则,C++/CLI包装器将是一个不错的选择。请参阅下面我的答案,以获取一个示例。我受到dll not found错误的质疑,但无论如何,您的方法是有效的。非常感谢!我遵循了这条指令,但收到这样的错误:“using语句中使用的类型必须隐式转换为‘System.IDisposable’”,为了避免内存泄漏,您应该另外实现finalizer!NativeClassWrapper();这将被垃圾收集器调用。这个包装确实有可以避免的内存泄漏。例如,我建议重新使用智能指针,而不是复制每个包装类中的删除逻辑,这可能是错误的。
using (var nativeObject = new NativeClassWrapper()) {
    nativeObject.Method();
}