Захват возвращаемого типа неуправляемого класса с помощью C++ / CLI
У меня есть метод в моей родной dll, который я хочу использовать. Метод возвращает объект типа, который также находится в моей родной dll.Я пытаюсь написать оболочку c++ / CLI.
Теперь,
- могу ли я получить возвращаемое значение в качестве объекта с помощью C++/CLI и как это сделать?
- можем ли мы сохранить и передать собственный объект C++?
- должен ли я создать свой собственный класс, напоминающий родной класс C++?
- Как мне организовать класс?
Например, мой родной dll имеет эти классы,
class X
{
/* some props and methods. */
};
Class Y
{
X* someMethod();
};
Мне нужно обернуть класс someMethod
с помощью C++/CLI. Смогу ли я получить возвращаемое значение в CLI?
1 ответ:
Возвращать указатели на объекты C++ из экспортируемой функции в DLL-это довольно плохая идея. Это неприятная проблема управления памятью, вы ожидаете, что клиентский код освободит объект. Это может привести только к хорошему концу, когда обе библиотеки DLL используют точную одну и ту же версию DLL-версии CRT (параметр компиляции/MD). Если вы не можете перекомпилировать собственную библиотеку DLL, то остановитесь прямо сейчас, вы не сможете заставить ее работать надежно или у вас возникнут большие проблемы с обслуживанием в будущем.
Во всяком случае, вам нужна обертка для обоих классов. Они должны выглядеть так:
#pragma managed(push, off) #include "xandy.h" #pragma managed(pop) using namespace System; namespace something { public ref class XWrapper { X* mX; public: XWrapper(X* obj) : mX(obj) {} ~XWrapper() { this->!XWrapper(); } !XWrapper() { // Trouble is here!!! delete mX; } }; public ref class YWrapper { Y* mY; public: YWrapper() { mY = new Y; } ~YWrapper() { this->!YWrapper(); } !YWrapper() { delete mY; } XWrapper^ someMethod() { return gcnew XWrapper(mY->someMethod()); } }; }