ObjRef 类

定义

存储生成代理以与远程对象通信所需的所有相关信息。Stores all relevant information required to generate a proxy in order to communicate with a remote object.

public ref class ObjRef : System::Runtime::Serialization::IObjectReference, System::Runtime::Serialization::ISerializable
[System.Runtime.InteropServices.ComVisible(true)]
[System.Security.SecurityCritical]
[System.Serializable]
public class ObjRef : System.Runtime.Serialization.IObjectReference, System.Runtime.Serialization.ISerializable
type ObjRef = class
    interface IObjectReference
    interface ISerializable
Public Class ObjRef
Implements IObjectReference, ISerializable
继承
ObjRef
属性
实现

示例

下面的代码示例演示如何使用自定义ObjRefThe following code example demonstrates the use of a custom ObjRef. 若要查看测试自定义ObjRef的激活代码, 请参阅RegisterWellKnownServiceType方法的示例。To view the activation code that tests the custom ObjRef, see the example for the RegisterWellKnownServiceType method.

// 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
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
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
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
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

注解

ObjRef是扩展MarshalByRefObject (MBR) 的对象的可序列化表示形式。A ObjRef is a serializable representation of an object that extends MarshalByRefObject (MBR). ObjRef 用于AppDomain跨边界传输对象引用。A ObjRef is used to transfer an object reference across a AppDomain boundary. ObjRef为对象创建是封送处理。Creating a ObjRef for an object is known as marshaling. 通过向远程处理ObjRef基础结构 ( MarshalByRefObject请参阅RemotingConfigurationRemotingServices.Marshal) 注册 mbr 对象, 或隐式创建 (封送 a), 方法是在调用远程对象.You can create a ObjRef (marshal a MarshalByRefObject) either explicitly, by registering the MBR object with the remoting infrastructure (see RemotingConfiguration and RemotingServices.Marshal), or implicitly, by passing an MBR object as a parameter when calling a remote object. 远程处理ObjRef使用对象来存储和传输有关正在进行远程处理MarshalByRefObject的所有相关信息。Remoting uses ObjRef objects to store and transmit all the relevant information about the MarshalByRefObject being remoted.

包含描述要封送处理Type的对象的和类、其确切位置以及与通信相关的信息的信息, 这些信息介绍如何到达对象所在的远程处理细分。 ObjRefThe ObjRef contains information that describes the Type and class of the object being marshaled, its exact location, and communication-related information on how to reach the remoting subdivision where the object is located.

封送类实现MarshalByRefObject后, 表示它ObjRef的将通过通道传输到另一个应用程序域中, 可能是在另一个进程或计算机中。After a class implementing MarshalByRefObject is marshaled, the ObjRef that represents it is transferred through a channel into another application domain, possibly in another process or computer. 当在ObjRef目标应用程序域中对进行反序列化 (请参阅XML 和 SOAP 序列化) 时, 将对其进行分析, 以创建远程 MBR 对象的透明代理。When the ObjRef is deserialized (see XML and SOAP Serialization) in the target application domain, it is parsed to create a transparent proxy for the remote MBR object. 此操作称为 "取消封送"。This operation is known as unmarshaling.

透明代理是一个对象, 该对象提供实际对象驻留在客户端空间中的假象。A transparent proxy is an object that provides the illusion that the actual object resides in the client's space. 它通过使用远程处理基础结构将对其进行的调用转发到实际对象来实现此目标。It achieves this by forwarding calls made on it to the real object using the remoting infrastructure. 透明代理本身由类型RealProxy的托管运行时类的实例驻留。The transparent proxy is itself housed by an instance of a managed run-time class of type RealProxy. RealProxy实现从透明代理转发操作所需的部分功能。The RealProxy implements a part of the functionality needed to forward the operations from the transparent proxy.

在中, 可以使用代理对象, 而无需考虑中的AppDomain任何远程处理细分。A proxy object can be used without regard to any remoting subdivisions within a AppDomain. 应用程序不需要区分代理引用和对象引用。Applications need not distinguish between proxy references and object references. 不过, 处理诸如激活、生存期管理和事务等问题的服务提供商需要进行这种区分。However, service providers dealing with issues such as activation, lifetime management, and transactions need to make such distinctions.

此类在类级别建立链接要求和继承要求。This class makes a link demand and an inheritance demand at the class level. 当直接调用方或派生类没有基础结构权限时,将引发。SecurityExceptionA SecurityException is thrown when either the immediate caller or the derived class does not have infrastructure permission. 有关安全要求的详细信息, 请参阅链接要求继承要求For details about security demands, see Link Demands and Inheritance Demands.

构造函数

ObjRef()

使用默认值初始化 ObjRef 类的新实例。Initializes a new instance of the ObjRef class with default values.

ObjRef(MarshalByRefObject, Type)

初始化 ObjRef 类的新实例以引用指定 MarshalByRefObject 的指定 TypeInitializes a new instance of the ObjRef class to reference a specified MarshalByRefObject of a specified Type.

ObjRef(SerializationInfo, StreamingContext)

用序列化数据初始化 ObjRef 类的新实例。Initializes a new instance of the ObjRef class from serialized data.

属性

ChannelInfo

获取或设置 IChannelInfoObjRefGets or sets the IChannelInfo for the ObjRef.

EnvoyInfo

获取或设置 IEnvoyInfoObjRefGets or sets the IEnvoyInfo for the ObjRef.

TypeInfo

获取或设置 IRemotingTypeInfo 描述的对象的 ObjRefGets or sets the IRemotingTypeInfo for the object that the ObjRef describes.

URI

获取或设置特定对象实例的 URI。Gets or sets the URI of the specific object instance.

方法

Equals(Object)

确定指定的对象是否等于当前对象。Determines whether the specified object is equal to the current object.

(继承自 Object)
GetHashCode()

作为默认哈希函数。Serves as the default hash function.

(继承自 Object)
GetObjectData(SerializationInfo, StreamingContext)

用序列化当前 SerializationInfo 实例所需的数据来填充指定的 ObjRefPopulates a specified SerializationInfo with the data needed to serialize the current ObjRef instance.

GetRealObject(StreamingContext)

返回对 ObjRef 描述的远程对象的引用。Returns a reference to the remote object that the ObjRef describes.

GetType()

获取当前实例的 TypeGets the Type of the current instance.

(继承自 Object)
IsFromThisAppDomain()

返回一个布尔值,该值指示当前的 ObjRef 实例是否引用位于当前 AppDomain 中的对象。Returns a Boolean value that indicates whether the current ObjRef instance references an object located in the current AppDomain.

IsFromThisProcess()

返回一个布尔值,该值指示当前的 ObjRef 实例是否引用位于当前进程中的对象。Returns a Boolean value that indicates whether the current ObjRef instance references an object located in the current process.

MemberwiseClone()

创建当前 Object 的浅表副本。Creates a shallow copy of the current Object.

(继承自 Object)
ToString()

返回表示当前对象的字符串。Returns a string that represents the current object.

(继承自 Object)

安全性

SecurityPermission
用于处理基础结构代码。for operating with infrastructure code. 要求值: InheritanceDemand;权限值:InfrastructureDemand value: InheritanceDemand; Permission Value: Infrastructure

适用于

另请参阅