Freigeben über


ObjRef Klasse

Definition

Speichert alle relevanten Informationen, die zum Generieren eines Proxys erforderlich sind, um mit einem Remoteobjekt zu kommunizieren.

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
Vererbung
ObjRef
Attribute
Implementiert

Beispiele

Das folgende Codebeispiel veranschaulicht die Verwendung einer benutzerdefinierten ObjRef. Informationen zum Anzeigen des Aktivierungscodes, der den benutzerdefinierten ObjRefTest testet, finden Sie im Beispiel für die RegisterWellKnownServiceType Methode.

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

Hinweise

A ObjRef ist eine serialisierbare Darstellung eines Objekts, das erweitert MarshalByRefObject wird (MBR). A ObjRef wird verwendet, um einen Objektverweis über eine AppDomain Grenze zu übertragen. Das Erstellen eines ObjRef Objekts für ein Objekt wird als Marshalling bezeichnet. Sie können ein ObjRef (Marshal a MarshalByRefObject) entweder explizit erstellen, indem Sie das MBR-Objekt bei der Remotinginfrastruktur registrieren (siehe RemotingConfiguration und RemotingServices.Marshal) oder implizit, indem Sie ein MBR-Objekt als Parameter übergeben, wenn ein Remoteobjekt aufgerufen wird. Remoting verwendet ObjRef Objekte, um alle relevanten Informationen über die MarshalByRefObject Remoteverbindung zu speichern und zu übertragen.

Die ObjRef enthält Informationen, die die Type Und-Klasse des Objekts beschreiben, das gemarstet wird, seine genaue Position und kommunikationsbezogene Informationen darüber, wie die Remotingunterteilung erreicht wird, in der sich das Objekt befindet.

Nachdem eine Klasse MarshalByRefObject implementiert wurde, wird die Klasse, die ObjRef sie darstellt, über einen Kanal in eine andere Anwendungsdomäne übertragen, möglicherweise in einem anderen Prozess oder Computer. Wenn die ObjRef Deerialisierung (siehe XML- und SOAP-Serialisierung) in der Zielanwendungsdomäne erfolgt, wird ein transparenter Proxy für das Remote-MBR-Objekt analysiert. Dieser Vorgang wird als Unmarshaling bezeichnet.

Ein transparenter Proxy ist ein Objekt, das die Illusion liefert, dass sich das tatsächliche Objekt im Clientbereich befindet. Dies wird erreicht, indem Aufrufe an das eigentliche Objekt weitergeleitet werden, indem die Remotinginfrastruktur verwendet wird. Der transparente Proxy befindet sich selbst in einer Instanz einer verwalteten Laufzeitklasse vom Typ RealProxy. Die RealProxy Implementierung eines Teils der Funktionalität, die erforderlich ist, um die Vorgänge vom transparenten Proxy weiterzuleiten.

Ein Proxyobjekt kann ohne Rücksicht auf Remotingunterteilungen innerhalb einer AppDomain. Anwendungen müssen nicht zwischen Proxyverweise und Objektverweise unterscheiden. Allerdings müssen Dienstanbieter, die sich mit Problemen wie Aktivierung, Lebensdauerverwaltung und Transaktionen befassen, solche Unterscheidungen treffen.

Diese Klasse macht eine Verknüpfungsnachfrage und eine Vererbungsnachfrage auf Klassenebene. Ein SecurityException Fehler wird ausgelöst, wenn entweder der direkte Aufrufer oder die abgeleitete Klasse keine Infrastrukturberechtigung besitzt. Ausführliche Informationen zu Sicherheitsanforderungen finden Sie unter Linkanforderungen.

Konstruktoren

Name Beschreibung
ObjRef()

Initialisiert eine neue Instanz der ObjRef Klasse mit Standardwerten.

ObjRef(MarshalByRefObject, Type)

Initialisiert eine neue Instanz der ObjRef Klasse, um auf einen angegebenen TypeWert MarshalByRefObject zu verweisen.

ObjRef(SerializationInfo, StreamingContext)

Initialisiert eine neue Instanz der ObjRef Klasse aus serialisierten Daten.

Eigenschaften

Name Beschreibung
ChannelInfo

Ruft ab oder legt den IChannelInfo für die ObjRef.

EnvoyInfo

Ruft ab oder legt den IEnvoyInfo für die ObjRef.

TypeInfo

Dient zum Abrufen oder Festlegen des IRemotingTypeInfo Objekts, das beschrieben ObjRef wird.

URI

Dient zum Abrufen oder Festlegen des URI der spezifischen Objektinstanz.

Methoden

Name Beschreibung
Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetHashCode()

Dient als die Standard-Hashfunktion

(Geerbt von Object)
GetObjectData(SerializationInfo, StreamingContext)

Füllt einen angegebenen SerializationInfo Wert mit den Daten auf, die zum Serialisieren der aktuellen ObjRef Instanz erforderlich sind.

GetRealObject(StreamingContext)

Gibt einen Verweis auf das Remoteobjekt zurück, das von der ObjRef Beschreibung beschrieben wird.

GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
IsFromThisAppDomain()

Gibt einen booleschen Wert, der angibt, ob die aktuelle ObjRef Instanz auf ein Objekt verweist, das sich im aktuellen AppDomainBefindet.

IsFromThisProcess()

Gibt einen booleschen Wert, der angibt, ob die aktuelle ObjRef Instanz auf ein Objekt verweist, das sich im aktuellen Prozess befindet.

MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für:

Weitere Informationen