3

我有以下结构:

//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^。

4

1 回答 1

0

我相信您在附加到进程时需要同时打开 Native 和 Managed 调试。

您可以通过单击“附加到:”框旁边的“选择”按钮在“附加到进程”对话框中执行此操作。

尽管通常将其设置为“自动”,这应该确定进程是否正在使用 CLR 运行并为此对话框选择正确的条目。

于 2010-11-26T11:11:27.553 回答