Мы находимся в процессе преобразования кода C# в C++, но нам нужно делать это поэтапно. Я сейчас нахожусь там, где мне нужно создать несколько собственных объектов из управляемого кода. Эти собственные объекты я не могу изменить, и их заявление выглядит следующим образом:Передача родной shared_ptr через управляемую сборку
public class NativeA();
public class NativeB(std::shared_ptr<NativeA> obj);
Оба NativeA и NativeB должны быть созданы из управляемого кода, как:
void main() {
ManagedA ObjectA = gcnew ManagedA();
ManagedB ObjectB = gcnew ManagedB(ObjectA);
}
Проблема возникает с получением shared_ptr из NativeA в конструкторе NativeB. Niether NativeA и NativeB будут управляться управляемым кодом, они просто должны быть созданы. В идеале, примерно так:
public ref class ManagedA {
public:
ManagedA() { _object = new NativeA(); }
~ManagedA() { delete _object; }
NativeA * Get() { return _object; }
private:
NativeA *_object;
};
public ref class ManagedB {
public:
ManagedB(ManagedA^ objectA) {
_object = new NativeB(std::make_shared<NativeA>(*objectA->Get());
}
~ManagedB() { delete _object; }
private:
NativeB *_object;
};
Но это не разрешено в C++/cli, поскольку родные типы объявляются частными. Определение #pragma make_public(NativeA)
также не решает.
Мое намерение не работать с собственными объектами в управляемом коде, их просто нужно создать, поэтому мне действительно не нужно пытаться маршалировать собственные указатели и иметь дело с .NET GC, если я не придется, и я не хочу делать копию. Я просто хочу обернуть классы, чтобы передать их.
Есть ли простой и простой способ сделать это?
, кроме незначительной синтаксической ошибки или двух, ваш код компилируется и запускается как есть. –
@ Дань, что вы скомпилируете? Я получаю 'Ошибка C3767: функция-кандидат недоступна'. Я использую visual studio 2015. Я думаю, что в старых версиях VS это сработало, но в последующих версиях реализован защищенный статус на родных типах. – user3072517
Обновление VS2015 # 3, новое приложение консоли C++/CLI. –