0

私はこの構造を渡そうとしています:

#pragma unmanaged
typedef struct
{
   void* data;
   unsigned nlen;
   unsigned int type; 
} PARAMETER;

このクラスの静的メソッドに:

#pragma managed
private class __gc GlobalFunctions
{
   static void WriteField(Object* object, PARAMTER& par, unsigned dec)
   {
       switch (par.type)
       {
          ....
       }
   }
};

この関数から:

public class __gc WorkerClass
{
   void SetValueAt(long index, Object* value)
   {
      PARAMETER aux;
      aux.type = 3;
      GlobalFunctions::WriteField(value, aux, 0);
   }
};

64 ビット システムで、アドレス '0x000c' を読み取れないというアクセス違反が発生します。

現在、64 ビット システムでは、par の参照がヌル ポインターである場合、par.type の逆参照は 0x0c のアドレスになります。par がスタック上にあることを除いて、null ポインターを WriteField に渡していませんが、1 つ取得しているようです。

さて、マネージ C++ で、あるマネージ クラス インスタンス メソッドから別の静的メソッドを呼び出す場合、参照によってアンマネージ構造を渡しているという事実は、ある種のマーシャリングの問題に対して脆弱ですか?

管理されていない構造が管理されたコードによってどのように扱われるかを説明する Web ドキュメントはありますか?

4

1 に答える 1

0

マネージド コードとアンマネージド コードをマネージド/アンマネージドとして明示的にコンパイルします。マネージ コードとアンマネージ コードが同じファイルに混在している場合は、pragma managed と pragma unmanaged を使用する必要があります。また、インクルード ファイルを使用する場合にも注意してください。

于 2009-07-28T02:01:22.323 に答える