Возврат указателя неуправляемого объекта в C # - PullRequest
0 голосов
/ 12 июля 2011

Я написал две управляемые оболочки C ++ для нативных классов C ++, и мне нужен неуправляемый объект нативного класса B в качестве возвращаемого параметра в функции управляемого Wrapper A, который создает нативный класс A!

Пример:

// Wrapper A

WrapperA::WrapperA(ClassB *classB)
{
    ClassA *classA = new ClassA(classB);
    ...
}

// native c++
ClassA::ClassA(ClassB *classB)
{
    m_classB = classB; // ClassB *m_classB; in .h
    ...
}

// Wrapper B

ClassB* WrapperB::GetNativeClassB()
{
    return m_classB; // ClassB *m_classB; in .h
}


// in C#
...
WrapperB wrapperB = new WrapperB();

unsafe // need for C++ pointer
{
WrapperA wrapperA = new WrapperA(wrapperB.GetNativeClassB() ); 
// Error: is inaccessible due to its protection level 
// -> is set to public
}
...

Есть ли лучший способ без небезопасных и почему я получаю ошибку доступа ???

Заранее спасибо!

приветствует leon22

Ответы [ 2 ]

1 голос
/ 12 июля 2011
  1. Уровень защиты : я уверен, что вы определили публично, но как насчет dll, содержащей символ?Вы уверены, что используете последний выпуск?

  2. Небезопасный : для использования / переноса небезопасного / нативного кода в качестве C ++ лучше всего использовать C ++/ CLI (ex Managed C ++), предоставляется начиная с выпуска Visual Studio 2005 .просто определите ref class , который обернет ваш собственный / неуправляемый класс, который будет напрямую доступен из управляемого кода, как C #.Подсказка для начала работы с Visual Studio: откройте новый CLR-проект dll из раздела Visual C ++;

C ++ / CLI - лучшее на мой взгляд решение

0 голосов
/ 13 июля 2011

Решение от: Передача оболочки C ++ / CLI собственного типа в другую сборку C ++ / CLI

// in WrapperB
property IntPtr _classB 
{
    IntPtr get() { return IntPtr(classB); }
}

// in WrapperA
ClassB *classB = static_cast<ClassB*>(wrapperB->_classB.ToPointer());
// ... do something ...
...