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の場合と同じ空の値を表示します。私がしていることに何か問題がありますか?別の方法でクラスをインスタンス化する必要がありますか?

UPDATE2:

マネージド/アンマネージドは次のようになります。

ラッパー:(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は空です(値= null)。アンマネージドIInterfaceからのメソッドにのみアクセスし、ラッパーCInterfaceからのWrapper^にはアクセスしないようなものです。

4

1 に答える 1

0

プロセスにアタッチするときは、ネイティブ デバッグとマネージド デバッグの両方をオンにする必要があると思います。

[プロセスにアタッチ] ダイアログ ボックスで、[アタッチ先:] ボックスの横にある [選択] ボタンをクリックして、これを行うことができます。

通常、これは「自動」に設定されていますが、これにより、プロセスが CLR で実行されているかどうかが判断され、このダイアログの正しいエントリが選択されます。

于 2010-11-26T11:11:27.553 に答える