Condividi tramite


ObjRef Classe

Definizione

Archivia tutte le informazioni pertinenti necessarie per generare un proxy per comunicare con un oggetto remoto.

public ref class ObjRef : System::Runtime::Serialization::IObjectReference, System::Runtime::Serialization::ISerializable
[System.Serializable]
public class ObjRef : System.Runtime.Serialization.IObjectReference, System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjRef : System.Runtime.Serialization.IObjectReference, System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Security.SecurityCritical]
public class ObjRef : System.Runtime.Serialization.IObjectReference, System.Runtime.Serialization.ISerializable
[<System.Serializable>]
type ObjRef = class
    interface IObjectReference
    interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ObjRef = class
    interface IObjectReference
    interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Security.SecurityCritical>]
type ObjRef = class
    interface IObjectReference
    interface ISerializable
Public Class ObjRef
Implements IObjectReference, ISerializable
Ereditarietà
ObjRef
Attributi
Implementazioni

Esempio

Nell'esempio di codice seguente viene illustrato l'uso di un oggetto personalizzato ObjRef. Per visualizzare il codice di attivazione che verifica l'oggetto personalizzato ObjRef, vedere l'esempio per il RegisterWellKnownServiceType metodo .

// a custom ObjRef class that outputs its status
[System::Security::Permissions::SecurityPermissionAttribute(
   System::Security::Permissions::SecurityAction::Demand, 
   Flags=System::Security::Permissions::SecurityPermissionFlag::SerializationFormatter)]
[System::Security::Permissions::SecurityPermissionAttribute
(System::Security::Permissions::SecurityAction::Demand, 
Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]	
[System::Security::Permissions::SecurityPermissionAttribute
(System::Security::Permissions::SecurityAction::InheritanceDemand, 
Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]
public ref class MyObjRef: public ObjRef
{
private:

   // only instantiate using marshaling or deserialization
   MyObjRef(){}

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

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

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

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

   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 != nullptr )
      {
         IMessageSink^ EISinks = EnvoyInfo->EnvoySinks;
         while ( EISinks != nullptr )
         {
            Console::WriteLine( "\tSink: {0}", EISinks );
            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 ref class LocalObject: public MarshalByRefObject
{
public:

   // overriding CreateObjRef will allow us to return a custom ObjRef
   [System::Security::Permissions::SecurityPermissionAttribute
   (System::Security::Permissions::SecurityAction::LinkDemand,
   Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]
   virtual ObjRef^ CreateObjRef( Type^ t ) override
   {
      return gcnew MyObjRef( this,t );
   }
};
// 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);
   }
}
' a custom ObjRef class that outputs its status
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
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
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
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

Commenti

È ObjRef una rappresentazione serializzabile di un oggetto che estende MarshalByRefObject (MBR). Un ObjRef oggetto viene utilizzato per trasferire un riferimento a un oggetto attraverso un AppDomain limite. La creazione di un ObjRef oggetto per un oggetto è nota come marshalling. È possibile creare un oggetto (effettuare il marshalling di un ObjRefMarshalByRefObjectoggetto ) in modo esplicito, registrando l'oggetto MBR con l'infrastruttura remota (vedere RemotingConfiguration e RemotingServices.Marshal) o in modo implicito, passando un oggetto MBR come parametro quando si chiama un oggetto remoto. La comunicazione remota usa ObjRef oggetti per archiviare e trasmettere tutte le informazioni pertinenti sull'oggetto MarshalByRefObject da remoto.

ObjRef Contiene informazioni che descrivono la Type classe e dell'oggetto di cui viene eseguito il marshalling, la posizione esatta e le informazioni correlate alla comunicazione su come raggiungere la suddivisione remota in cui si trova l'oggetto.

Dopo aver eseguito il marshalling di una classe MarshalByRefObject , l'oggetto ObjRef che lo rappresenta viene trasferito tramite un canale in un altro dominio applicazione, possibilmente in un altro processo o computer. Quando l'oggetto ObjRef viene deserializzato (vedere Serializzazione XML e SOAP) nel dominio dell'applicazione di destinazione, viene analizzato per creare un proxy trasparente per l'oggetto MBR remoto. Questa operazione è nota come unmarshaling.

Un proxy trasparente è un oggetto che fornisce l'illusione che l'oggetto effettivo risieda nello spazio del client. Questo risultato viene ottenuto inoltrando le chiamate effettuate all'oggetto reale usando l'infrastruttura di comunicazione remota. Il proxy trasparente è ospitato da un'istanza di una classe di runtime gestita di tipo RealProxy. RealProxy implementa una parte della funzionalità necessaria per inoltrare le operazioni dal proxy trasparente.

Un oggetto proxy può essere usato senza considerare le suddivisioni remote all'interno di un oggetto AppDomain. Le applicazioni non devono distinguere tra riferimenti proxy e riferimenti a oggetti. Tuttavia, i provider di servizi che gestiscono problemi come l'attivazione, la gestione della durata e le transazioni devono fare tali distinzioni.

Questa classe effettua una richiesta di collegamento e una richiesta di ereditarietà a livello di classe. Viene SecurityException generata un'eccezione quando il chiamante immediato o la classe derivata non dispone dell'autorizzazione dell'infrastruttura. Per informazioni dettagliate sulle richieste di sicurezza, vedere Richieste di collegamento.

Costruttori

Nome Descrizione
ObjRef()

Inizializza una nuova istanza della ObjRef classe con valori predefiniti.

ObjRef(MarshalByRefObject, Type)

Inizializza una nuova istanza della ObjRef classe per fare riferimento a un oggetto specificato MarshalByRefObject di un oggetto specificato Type.

ObjRef(SerializationInfo, StreamingContext)

Inizializza una nuova istanza della classe ObjRef dai dati serializzati.

Proprietà

Nome Descrizione
ChannelInfo

Ottiene o imposta l'oggetto IChannelInfo per l'oggetto ObjRef.

EnvoyInfo

Ottiene o imposta l'oggetto IEnvoyInfo per l'oggetto ObjRef.

TypeInfo

Ottiene o imposta l'oggetto IRemotingTypeInfo per l'oggetto descritto dall'oggetto ObjRef .

URI

Ottiene o imposta l'URI dell'istanza dell'oggetto specifica.

Metodi

Nome Descrizione
Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetObjectData(SerializationInfo, StreamingContext)

Popola un oggetto specificato SerializationInfo con i dati necessari per serializzare l'istanza corrente ObjRef .

GetRealObject(StreamingContext)

Restituisce un riferimento all'oggetto remoto descritto dall'oggetto ObjRef .

GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
IsFromThisAppDomain()

Restituisce un valore booleano che indica se l'istanza corrente ObjRef fa riferimento a un oggetto che si trova nell'oggetto corrente AppDomain.

IsFromThisProcess()

Restituisce un valore booleano che indica se l'istanza corrente ObjRef fa riferimento a un oggetto che si trova nel processo corrente.

MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a

Vedi anche