Остерегайтесь того, что семантика копирования в C ++ и .NET принципиально отличается: .NET использует общие ссылки для сбора мусора, а C ++ использует конструкторы копирования.
C ++ / CLI не позволит использовать собственные объекты в качестве членов управляемых классов, вам придется использовать указатели.Поэтому я буду использовать общие указатели boost для имитации семантики .NET.
Это можно абстрагировать.Вот класс, который я использую для представления классов C ++ в мире .NET:
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(T* ptr) : t(new boost::shared_ptr<T>(ptr)) {}
Handle% operator=(T* p)
{
if (p != t->get()) t->reset(p);
return *this;
}
T* get() { return t->get(); }
// Remember that operators are static in .NET
static boost::shared_ptr<T> operator->(Handle% h) { return *h.t; }
T& reference() { return *t->get(); }
T const& const_reference() { return *t->get(); }
};
Затем вы можете использовать:
ref class MyStruct
{
public:
// Expose your .NET interface here, make it use the handle variable.
internal:
Handle<Native::MyStruct> handle;
};
и использовать переменную-член handle
в вашем C ++Код без ограничений.Это не будет показано в .NET.Затем вы можете выставлять свойства, методы доступа, операторы и т. Д. В стиле .NET.