ObjRef Klasa

Definicja

Przechowuje wszystkie istotne informacje wymagane do wygenerowania serwera proxy w celu komunikowania się z obiektem zdalnym.

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
Dziedziczenie
ObjRef
Atrybuty
Implementuje

Przykłady

W poniższym przykładzie kodu pokazano użycie niestandardowego ObjRefelementu . Aby wyświetlić kod aktywacji, który testuje niestandardowy ObjRefkod , zobacz przykład RegisterWellKnownServiceType metody .

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

Uwagi

A ObjRef to serializowalna reprezentacja obiektu, który rozszerza MarshalByRefObject (MBR). Obiekt ObjRef jest używany do transferu odwołania do obiektu przez granicę AppDomain . ObjRef Tworzenie obiektu dla obiektu jest nazywane marshalingiem. Można utworzyć obiekt (marshal a MarshalByRefObjectObjRef ) jawnie, rejestrując obiekt MBR za pomocą infrastruktury komunikacji zdalnej (zobacz RemotingConfiguration i RemotingServices.Marshal), lub niejawnie, przekazując obiekt MBR jako parametr podczas wywoływania obiektu zdalnego. Komunikacja zdalna używa ObjRef obiektów do przechowywania i przesyłania wszystkich istotnych informacji o zdalnym MarshalByRefObject kodzie.

Zawiera ObjRef informacje opisujące klasę Type i obiektu, który jest marshaled, jego dokładną lokalizację i informacje dotyczące komunikacji dotyczące sposobu dotarcia do poddziału komunikacji, w której znajduje się obiekt.

Po przeprowadzeniu marshalingu ObjRef klasy MarshalByRefObject , który reprezentuje go jest transferowany za pośrednictwem kanału do innej domeny aplikacji, prawdopodobnie w innym procesie lub komputerze. ObjRef Podczas deserializacji (zobacz XML i SOAP Serialization) w domenie aplikacji docelowej, jest analizowany w celu utworzenia przezroczystego serwera proxy dla zdalnego obiektu MBR. Ta operacja jest znana jako unmarshaling.

Przezroczysty serwer proxy to obiekt, który zapewnia iluzję, że rzeczywisty obiekt znajduje się w przestrzeni klienta. Umożliwia to przekazanie wywołań do obiektu rzeczywistego przy użyciu infrastruktury komunikacji telefonicznej. Przezroczysty serwer proxy jest sam mieści się w wystąpieniu zarządzanej klasy czasu wykonywania typu RealProxy. Element RealProxy implementuje część funkcji potrzebnej do przekazywania operacji z przezroczystego serwera proxy.

Obiekt proxy może być używany bez względu na jakiekolwiek poddziały komunikacji zdalniej w obrębie obiektu AppDomain. Aplikacje nie muszą rozróżniać odwołań do serwera proxy i odwołań do obiektów. Jednak dostawcy usług, którzy zajmują się problemami, takimi jak aktywacja, zarządzanie okresem istnienia i transakcje, muszą wprowadzić takie różnice.

Ta klasa sprawia, że żądanie łącza i zapotrzebowanie na dziedziczenie na poziomie klasy. Obiekt SecurityException jest zgłaszany, gdy obiekt wywołujący natychmiast lub klasa pochodna nie ma uprawnień do infrastruktury. Aby uzyskać szczegółowe informacje na temat wymagań dotyczących zabezpieczeń, zobacz Link Demands and Inheritance Demands (Wymagania dotyczące linków i żądań dziedziczenia).

Konstruktory

ObjRef()

Inicjuje nowe wystąpienie klasy ObjRef z domyślnymi wartościami.

ObjRef(MarshalByRefObject, Type)

Inicjuje ObjRef nowe wystąpienie klasy w celu odwołania się do określonego określonego TypeMarshalByRefObject elementu .

ObjRef(SerializationInfo, StreamingContext)

Inicjuje ObjRef nowe wystąpienie klasy z serializowanych danych.

Właściwości

ChannelInfo

Pobiera lub ustawia wartość IChannelInfo dla .ObjRef

EnvoyInfo

Pobiera lub ustawia wartość IEnvoyInfo dla .ObjRef

TypeInfo

Pobiera lub ustawia IRemotingTypeInfo obiekt, który ObjRef opisuje.

URI

Pobiera lub ustawia identyfikator URI określonego wystąpienia obiektu.

Metody

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetObjectData(SerializationInfo, StreamingContext)

Wypełnia określony element SerializationInfo danymi wymaganymi do serializacji bieżącego ObjRef wystąpienia.

GetRealObject(StreamingContext)

Zwraca odwołanie do obiektu zdalnego, który ObjRef opisuje.

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
IsFromThisAppDomain()

Zwraca wartość logiczną wskazującą, czy bieżące ObjRef wystąpienie odwołuje się do obiektu znajdującego się w bieżącym AppDomainobiekcie .

IsFromThisProcess()

Zwraca wartość logiczną wskazującą, czy bieżące ObjRef wystąpienie odwołuje się do obiektu znajdującego się w bieżącym procesie.

MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy

Zobacz też