我有一个原生的C ++ DLL,一些头文件和导入库。有没有办法如何实现在dll中定义的C#中的对象?
我所知道的两种方式是:
答案 0 :(得分:7)
C ++ / CLI是你的朋友。但是你会遇到一个问题:无法在C ++ / CLI ref或value类(.NET的那些)中存储标准C ++对象。因此,您将不得不求助于我在生产代码中使用的以下类(您可以修改):
#pragma once
#include <boost/shared_ptr.hpp>
template <typename T>
ref class Handle
{
boost::shared_ptr<T>* t;
!Handle()
{
if (t != nullptr)
{
delete t;
t = nullptr;
}
}
~Handle() { this->!Handle(); }
public:
Handle() : t(new boost::shared_ptr<T>((T*)0)) {}
Handle% operator=(T* p)
{
if (p != t->get()) t->reset(p);
return *this;
}
static T* operator&(Handle% h) { return h.t->get(); }
static boost::shared_ptr<T> operator->(Handle% h) { return *h.t; }
T& reference() { return *t->get(); }
T const& const_reference() { return *t->get(); }
};
用法:C ++ / CLI类中的Handle<MyCppClass>^ handle;
。然后,您实现存根方法,将它们转发给handle
成员。垃圾收集对象将调用C ++类实例的析构函数,如果没有指向它的指针:
public ref class Foo
{
void bar() { handle->bar(); }
internal:
Handle<CppNamespace::Foo>^ handle;
};
答案 1 :(得分:3)
我认为您的选择只是构建一个C ++ / CLI类包装器(因此您可以像c#类一样引用它),否则您无法从c#代码实例化c ++类(非托管)。
替代方案可能是“丑陋”的方式:通过ac函数实例化c ++类,但是你会把类视为c#代码中的void指针,所以你基本上不会对它做任何事情(除非你创建与此类交互的其他函数;只有C函数)
C#理解C,如果你想让它理解C ++,你必须使用C ++ / CLI
P.S。 C#对C ++类有一些基本的了解,但它只是将类数据(我的意思是字节:字段)转换为C#中的一些可用数据(有一些属性),但不允许使用方法和类似的东西(避免完全是我的建议)。