Захват возвращаемого типа неуправляемого класса с использованием C ++ / CLI - PullRequest
4 голосов
/ 06 августа 2011

У меня есть метод в моей родной DLL, который я хочу использовать. Метод возвращает объект типа, который также находится в моем родном dll. Я пытаюсь написать оболочку c ++ / CLI.

Теперь

  • Могу ли я получить возвращаемое значение в качестве объекта с использованием C ++ / CLI и как мне это сделать?
  • Можем ли мы сохранить и передать нативный объект C ++?
  • Нужно ли мне создавать свой собственный класс, похожий на нативный класс C ++?
  • Как бы я собрал класс?

Например, мой родной dll имеет эти классы,

class X
{
    /* some props and methods. */
};


Class Y
{
    X* someMethod();
};

Мне нужно обернуть класс someMethod с помощью C ++ / CLI. Смогу ли я получить возвращаемое значение в CLI?

1 Ответ

1 голос
/ 06 августа 2011

Возвращать указатели на объекты 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());
        }
    };
}
...