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