2016-12-07 2 views
0

Мы находимся в процессе преобразования кода 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, если я не придется, и я не хочу делать копию. Я просто хочу обернуть классы, чтобы передать их.

Есть ли простой и простой способ сделать это?

+0

, кроме незначительной синтаксической ошибки или двух, ваш код компилируется и запускается как есть. –

+0

@ Дань, что вы скомпилируете? Я получаю 'Ошибка C3767: функция-кандидат недоступна'. Я использую visual studio 2015. Я думаю, что в старых версиях VS это сработало, но в последующих версиях реализован защищенный статус на родных типах. – user3072517

+0

Обновление VS2015 # 3, новое приложение консоли C++/CLI. –

ответ

0

Похоже, что ответ не был вызван синтаксисом или проблемой использования. Два управляемых объекта были в разных DLL и не могли быть переданы через них через .NET. После того, как код был скомпилирован в том же проекте, проблема была решена.

Хотя сообщение об ошибке показало, что проблема связана с проблемой доступности в VS 2015, и поскольку она сообщила об этом во время фазы ссылки, я подозреваю, что причина была в том, что компоновщик не знал бы о реализации NativeA в NativeB без объявление внешнего. Будучи завернутым в CLR, это всплыло как другая проблема.

Смежные вопросы