【问题标题】:C++/CLI wrapper for native C++ to use as reference in C#用于本机 C++ 的 C++/CLI 包装器,可在 C# 中用作参考
【发布时间】:2012-04-19 07:06:31
【问题描述】:

标题解释。我有本机 C++ dll,我正在为其编写 C++/CLI 包装器,而这些 dll 又将作为参考导入到 C# 中。

问题是在 C# 中我看不到包装器中的类(从 DLL 导入)。

我应该使用哪些关键字以及如何重新声明我的原生 C++ 对象以在 C# 中可见?

【问题讨论】:

  • 包装类是公开的吗?声明应为“public ref class { ... };”
  • 我知道。我要问的是这样的事情是否可能:public ref class wrapper_class = native_class;?这种方法可行吗?
  • 没那么简单。包装器类将承载一个 native_class 对象,并为您想要公开的所有 native_class 方法创建包装器方法。包装器方法只是编组参数并将调用委托给 native_class 对象。
  • 好的,那么最简单的解决方案是什么?导致开销最小或重定向成员函数调用的那个?
  • 如果您能以某种方式将您的类功能公开为 C 函数,那么您可以使用 P/Invoke。否则,C++/CLI 包装器将继续存在。请参阅下面的答案以获取示例。

标签: c# c++ dll c++-cli


【解决方案1】:

好的,教程。您有一个 C++ 类 NativeClass 想要公开给 C#。

class NativeClass { 
public:
    void Method();
};

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() 被调用,它立即运行析构函数并销毁本机对象。否则你将有内存泄漏并且可能会死得很惨(不是你,程序)。注意:The Dispose() method is magically created for you.

【讨论】:

  • 我遇到了 dll not found 错误,但无论如何,你的方法有效。非常感谢!
  • 我遵循了这条指令,但收到这样的错误“在 using 语句中使用的类型必须隐式转换为 'System.IDisposable'”
  • 为了避免来自 4) 的内存泄漏,您应该另外实现终结器 !NativeClassWrapper();将被垃圾收集器调用
  • 这个包装器确实有可避免的内存泄漏。我建议重新使用智能指针,例如this one I wrote,而不是在每个包装类中复制可能错误的删除逻辑。
  • 按照建议实施了终结器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
相关资源
最近更新 更多