我有以下结构:
//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 函数从 Parser 类调用 Transmit 方法。问题是当我调试时,pParser 实例是空的(即使我之前已经在构造函数中实例化了它)。
这是垃圾收集器问题还是虚拟表误导?我该如何解决?谢谢 !
更新: 经过进一步调试后,我意识到如果我包含其他 gcroot 实例,例如:
gcroot<AppDomaion^> pDomain;
然后,在代码中,尝试运行:
pDomain = AppDomain::CurrentDomain;
调试器将显示与 pParser 相同的空值。我在做什么有什么问题吗?我应该以不同的方式实例化类吗?
更新2:
托管/非托管是这样的:
包装器:(包装器.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;
};
包装器(包装器.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 没有实例。然后,在 Wrapper 中,mParent 为空(value = null);就像它只会访问来自非托管 IInterface 的方法,而不是来自包装器 CInterface 的 Wrapper^。