如何从C#导入和使用非托管C ++类?

我有一个原生的C ++ DLL,一些头文件和导入库。 有没有办法如何在dll中定义的C#中实例化对象?

我所知道的两种方式是:

  1. 将C ++代码包装到COM中
  2. 使用DLLImport和外部C函数

C ++ / CLI是您的朋友。 但是你会遇到一个问题:无法在C ++ / CLI ref或value类(.NET的那些)中存储标准C ++对象。 因此,您将不得不求助于我在生产代码中使用的以下类(您可以修改):

#pragma once #include  template  ref class Handle { boost::shared_ptr* t; !Handle() { if (t != nullptr) { delete t; t = nullptr; } } ~Handle() { this->!Handle(); } public: Handle() : t(new boost::shared_ptr((T*)0)) {} Handle% operator=(T* p) { if (p != t->get()) t->reset(p); return *this; } static T* operator&(Handle% h) { return ht->get(); } static boost::shared_ptr operator->(Handle% h) { return *ht; } T& reference() { return *t->get(); } T const& const_reference() { return *t->get(); } }; 

用法: Handle^ handle; 在C ++ / CLI类中。 然后,您实现存根方法,将它们转发到handle成员。 垃圾收集对象将调用C ++类实例的析构函数,如果没有更多指向它的指针:

 public ref class Foo { void bar() { handle->bar(); } internal: Handle^ handle; }; 

我认为您的选择只是构建一个C ++ / CLI类包装器(因此您可以像ac#类一样引用它),否则您无法从c#代码实例化c ++类(非托管)。

替代方案可能是“丑陋”的方式:通过ac函数实例化c ++类,但你会把类视为c#代码中的void指针,所以你基本上不会对它做任何事情(除非你创建其他函数到与这个类交互;只有C函数)

C#理解C,如果你想让它理解C ++你必须使用C ++ / CLI

PS C#对C ++类有一些基本的了解,但它只是将类数据(我的意思是字节:字段)转换为C#中的一些可用数据(有一些属性),但不允许使用类似的方法和事物(完全避免是我的建议)。