Захват возвращаемого типа неуправляемого класса с помощью 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 4

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());
        }
    };
}