ObjRef クラス

プロキシを生成してリモート オブジェクトと通信するために必要なすべての関連情報を格納します。

この型のすべてのメンバの一覧については、ObjRef メンバ を参照してください。

System.Object
   System.Runtime.Remoting.ObjRef

<Serializable>
Public Class ObjRef   Implements IObjectReference, ISerializable
[C#]
[Serializable]
public class ObjRef : IObjectReference, ISerializable
[C++]
[Serializable]
public __gc class ObjRef : public IObjectReference, ISerializable
[JScript]
public
   Serializable
class ObjRef implements IObjectReference, ISerializable

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

ObjRef は、 MarshalByRefObject (MBR) を拡張するオブジェクトのシリアル化可能な表現です。 ObjRef は、 AppDomain 境界を超えてオブジェクト参照を転送するために使用します。オブジェクトの ObjRef を作成することをマーシャリングと言います。MBR オブジェクトをリモート処理インフラストラクチャ (RemotingConfigurationRemotingServices.Marshal のトピックを参照) に登録することによって明示的に、またはリモート オブジェクトを呼び出すときにパラメータとして MBR オブジェクトを渡すことによって暗黙に ObjRef を作成 (MarshalByRefObject をマーシャリング) できます。リモート処理は、 ObjRef オブジェクトを使用して、リモート処理中の MarshalByRefObject についてのすべての関連情報を格納および送信します。

ObjRef は、マーシャリングしているオブジェクトの Type とクラスを記述する情報、その正確な場所、そのオブジェクトが配置されているリモート処理サブ区分に到達する方法についての通信関連情報を格納します。

MarshalByRefObject を実装しているクラスをマーシャリングした後に、そのクラスを表す ObjRef は、チャネルを通じて別のアプリケーション ドメイン、場合によっては別のプロセスまたはコンピュータに転送されます。 ObjRef は、対象アプリケーション ドメインで逆シリアル化 (「 XML シリアル化および SOAP シリアル化 」を参照) したときに、リモート MBR オブジェクトの透過プロキシを作成するために解析されます。この操作をマーシャリング解除と言います。

透過プロキシは、実際のオブジェクトがクライアントの領域に格納されているように見せかけるオブジェクトです。これは、リモート処理インフラストラクチャを使用して、自らに対する呼び出しを実際のオブジェクトに転送することによって実現されます。透過プロキシ自体は、 RealProxy 型のマネージ ランタイム クラスのインスタンスに格納されます。 RealProxy は、透過プロキシから操作を転送するために必要な機能の一部を実装します。

プロキシ オブジェクトは、 AppDomain 内のリモート処理サブ区分を考慮せずに使用できます。アプリケーションは、プロキシ参照とオブジェクト参照を区別する必要がありません。ただし、アクティベーション、有効期間の管理、トランザクションなどの問題を扱うサービス プロバイダは、このような区別を行う必要があります。

メモ   このクラスは、リンク確認要求と継承確認要求をクラス レベルで行います。直前の呼び出し元または派生クラスにインフラストラクチャ アクセス許可がない場合、 SecurityException がスローされます。セキュリティ要求の詳細については、「 リンク確認要求 」および「 継承確認要求 」を参照してください。

使用例

[Visual Basic, C#, C++] カスタム ObjRef の使用方法を示すコード例を次に示します。カスタム ObjRef をテストするアクティベーション コードを表示するには、 RegisterWellKnownServiceType メソッドのトピックの例を参照してください。

 
' a custom ObjRef class that outputs its status
Public Class MyObjRef
   Inherits ObjRef

   ' only instantiate using marshaling or deserialization
   Private Sub New()
   End Sub

   Public Sub New(ByVal o As MarshalByRefObject, ByVal t As Type)
      MyBase.New(o, t)
      Console.WriteLine("Created MyObjRef.")
      ORDump()
   End Sub

   Public Sub New(ByVal i As SerializationInfo, ByVal c As StreamingContext)
      MyBase.New(i, c)
      Console.WriteLine("Deserialized MyObjRef.")
   End Sub

   Public Overrides Sub GetObjectData(ByVal s As SerializationInfo, ByVal c As StreamingContext)
      ' After calling the base method, change the type from ObjRef to MyObjRef
      MyBase.GetObjectData(s, c)
      s.SetType([GetType]())
      Console.WriteLine("Serialized MyObjRef.")
   End Sub

   Public Overrides Function GetRealObject(ByVal context As StreamingContext) As [Object]
      If IsFromThisAppDomain() Or IsFromThisProcess() Then
         Console.WriteLine("Returning actual object referenced by MyObjRef.")
         Return MyBase.GetRealObject(context)
      Else
         Console.WriteLine("Returning proxy to remote object.")
         Return RemotingServices.Unmarshal(Me)
      End If
   End Function

   Public Sub ORDump()
      Console.WriteLine(" --- Reporting MyObjRef Info --- ")
      Console.WriteLine("Reference to {0}.", TypeInfo.TypeName)
      Console.WriteLine("URI is {0}.", URI)

      Console.WriteLine(ControlChars.Cr + "Writing EnvoyInfo: ")
      If Not (EnvoyInfo Is Nothing) Then
         Dim EISinks As IMessageSink = EnvoyInfo.EnvoySinks
         Dim count As Integer = 0
         While Not (EISinks Is Nothing)
            Console.WriteLine(ControlChars.Tab + "Interated through sink #{0}", (count = count + 1))
            EISinks = EISinks.NextSink
         End While
      Else
         Console.WriteLine(ControlChars.Tab + " {no sinks}")
      End If
      Console.WriteLine(ControlChars.Cr + "Writing ChannelInfo: ")
      Dim i As Integer
      For i = 0 To ChannelInfo.ChannelData.Length - 1
         Console.WriteLine(ControlChars.Tab + "Channel: {0}", ChannelInfo.ChannelData(i))
      Next i
      Console.WriteLine(" ----------------------------- ")
   End Sub
   
End Class


' a class that uses MyObjRef
Public Class LocalObject
   Inherits MarshalByRefObject

   ' overriding CreateObjRef will allow us to return a custom ObjRef
   Public Overrides Function CreateObjRef(ByVal t As Type) As ObjRef
      Return New MyObjRef(Me, t)
   End Function

End Class

[C#] 
// a custom ObjRef class that outputs its status
public class MyObjRef : ObjRef {
   
   // only instantiate using marshaling or deserialization
   private MyObjRef() { }

   public MyObjRef(MarshalByRefObject o, Type t) : base(o, t)  {
      Console.WriteLine("Created MyObjRef.");
      ORDump();
   }

   public MyObjRef(SerializationInfo i, StreamingContext c) : base(i, c) {
      Console.WriteLine("Deserialized MyObjRef.");
   }

   public override void GetObjectData(SerializationInfo s, StreamingContext c) {
      // After calling the base method, change the type from ObjRef to MyObjRef
      base.GetObjectData(s, c);
      s.SetType(GetType());
      Console.WriteLine("Serialized MyObjRef.");
   }

   public override Object GetRealObject(StreamingContext context) {

      if ( IsFromThisAppDomain() || IsFromThisProcess() ) {
         Console.WriteLine("Returning actual object referenced by MyObjRef.");
         return base.GetRealObject(context);
      }
      else {
         Console.WriteLine("Returning proxy to remote object.");
         return RemotingServices.Unmarshal(this);
      }
   }   

   public void ORDump() {

      Console.WriteLine(" --- Reporting MyObjRef Info --- ");
      Console.WriteLine("Reference to {0}.", TypeInfo.TypeName);
      Console.WriteLine("URI is {0}.", URI);
      Console.WriteLine("\nWriting EnvoyInfo: ");

      if ( EnvoyInfo != null) {
         
         IMessageSink EISinks = EnvoyInfo.EnvoySinks;
         while (EISinks != null) {
            Console.WriteLine("\tSink: " + EISinks.ToString());  
            EISinks = EISinks.NextSink;
         }
      }
      else
         Console.WriteLine("\t {no sinks}");

      Console.WriteLine("\nWriting ChannelInfo: ");
      for (int i = 0; i < ChannelInfo.ChannelData.Length; i++)
         Console.WriteLine ("\tChannel: {0}", ChannelInfo.ChannelData[i]);
      Console.WriteLine(" ----------------------------- ");
   }
}


// a class that uses MyObjRef
public class LocalObject : MarshalByRefObject {
   // overriding CreateObjRef will allow us to return a custom ObjRef
   public override ObjRef CreateObjRef(Type t) {
      return new MyObjRef(this, t);
   }
}

[C++] 
// a custom ObjRef class that outputs its status
public __gc class MyObjRef : public ObjRef 
{
    // only instantiate using marshaling or deserialization
private:
    MyObjRef() { }

public:
    MyObjRef(MarshalByRefObject* o, Type* t) : ObjRef(o, t) 
    {
        Console::WriteLine(S"Created MyObjRef.");
        ORDump();
    }

public:
    MyObjRef(SerializationInfo* i, StreamingContext c) : ObjRef(i, c) 
    {
        Console::WriteLine(S"Deserialized MyObjRef.");
    }

public:
    void GetObjectData(SerializationInfo* s, StreamingContext c) 
    {
        // After calling the base method, change the type from ObjRef to MyObjRef
        ObjRef::GetObjectData(s, c);
        s->SetType(GetType());
        Console::WriteLine(S"Serialized MyObjRef.");
    }

public:
    Object* GetRealObject(StreamingContext context) 
    {
        if (IsFromThisAppDomain() || IsFromThisProcess()) 
        {
            Console::WriteLine(S"Returning actual Object* referenced by MyObjRef.");
            return ObjRef::GetRealObject(context);
        }
        else 
        {
            Console::WriteLine(S"Returning proxy to remote Object*.");
            return RemotingServices::Unmarshal(this);
        }
    }   

public:
    void ORDump() 
    {
        Console::WriteLine(S" --- Reporting MyObjRef Info --- ");
        Console::WriteLine(S"Reference to {0}.", TypeInfo->TypeName);
        Console::WriteLine(S"URI is {0}.", URI);
        Console::WriteLine(S"\nWriting EnvoyInfo: ");

        if (EnvoyInfo != 0) 
        {

            IMessageSink* EISinks = EnvoyInfo->EnvoySinks;
            while (EISinks != 0) {

                Console::WriteLine(S"\tSink: {0}", EISinks);  
                EISinks = EISinks->NextSink;
            }
        } 
        else
            Console::WriteLine(S"\t {no sinks}");

        Console::WriteLine(S"\nWriting ChannelInfo: ");
        for (int i = 0; i < ChannelInfo->ChannelData->Length; i++)
            Console::WriteLine (S"\tChannel: {0}", ChannelInfo->ChannelData->Item[i]);
        Console::WriteLine(S" ----------------------------- ");
    }
};

// a class that uses MyObjRef
public __gc class LocalObject : public MarshalByRefObject 
{
    // overriding CreateObjRef will allow us to return a custom ObjRef
public:
    ObjRef* CreateObjRef(Type* t) 
    {
        return new MyObjRef(this, t);
    }
};

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Runtime.Remoting

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

.NET Framework セキュリティ:

参照

ObjRef メンバ | System.Runtime.Remoting 名前空間 | ISerializable | RemotingServices.Marshal | RemotingServices.Unmarshal | RealProxy