У меня следующая структура:
//Unmanaged(.h)
class myInterface
{
public:
virtual bool Send(char* myChar);
}
//Managed (.h)
class myClass;
public ref class Parser
{
bool Transmit(String^ mString);
}
class myClass : public myInterface
{
public:
virtual bool Send(char* myChar);
private:
gcroot<Parser^> pParser;
}
Моя проблема в том, что где-то в моем неуправляемом коде я должен вызвать функцию Send.Он вызывает функцию из управляемого кода Send, но функция Send вызывает метод Transmit из класса Parser.Проблема в том, что когда я отлаживаю, экземпляр pParser пуст (даже если я уже создал его ранее в конструкторе).
Это ошибка сборщика мусора или виртуальная таблица вводит в заблуждение?Как я могу это исправить?Спасибо!
ОБНОВЛЕНИЕ: После некоторой дальнейшей отладки я понял, что если я включу другие экземпляры gcroot, например:
gcroot<AppDomaion^> pDomain;
и затем в коде попытался запустить:
pDomain = AppDomain::CurrentDomain;
Отладчик покажет то же пустое значение, что и для pParser.Что-то не так с тем, что я делаю?я должен создать экземпляр класса по-другому?
UPDATE2:
Managed / Unmanaged выглядит примерно так:
Wrapper: (wrapper.h)
public ref class Wrapper
{
public:
Send(String^ mSendMessage);
Parse(String^ mMessageString);
...
private:
ComLayer* mComm;
CInferface mInterface;
};
private class CInterface : public IIterface
{
public:
virtual bool Deliver(CMessage mMessage);
...
private:
gcroot<Wrapper^> mParent;
};
Оболочка (wrapper.cpp)
Wrapper::Send(String^ mSendMessage)
{
...
mComm->Send(mMessage);
}
Wrapper::Parse(String^ mMessageString)
{
...
}
CInterface::Deliver(CMessage* mMessage)
{
...
//Here, mParent value is empty under Labview, not while Debug/VS/WindowsForm
mParent->Parse(mMessageString)
}
Неуправляемый: (commLayer.h)
class CommLayer
{
public:
//Send:
bool Send(CMessage* mMessage);
...
private:
//instead of CInterface, IInterface.
IInterface mInterface;
};
Неуправляемый: (IInterface.h)
class IInterface
{
public:
//Response:
virtual bool Deliver(CMessage mMessage);
};
Проблема в том, что когда неуправляемый код вызывает mInferface-> Deliver (mMessage);Там нет экземпляра для mParent.Затем в оболочке mParent пуст (значение = ноль);Похоже на то, что он получит доступ только к методам из неуправляемого интерфейса II, а не к обертке ^ из оболочки CInterface.