ObjRef ObjRef ObjRef ObjRef Class

定义

存储生成代理以与远程对象通信所需的所有相关信息。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
继承
ObjRefObjRefObjRefObjRef
属性
实现

示例

下面的代码示例演示如何使用自定义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) 是显式注册 MBR 对象与远程处理基础结构 (请参阅RemotingConfigurationRemotingServices.Marshal),而隐式调用远程时作为参数传递的 MBR 对象对象。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.

ObjRef包含描述信息Type和该对象的类被封送处理、 其确切位置和如何到达远程处理分支对象所在的位置与通信相关的信息。The 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. 透明代理是由类型的托管运行时类的实例本身RealProxyThe 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.

可以使用代理对象中不考虑AppDomainA 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. 一个SecurityException直接调用方或派生的类不包含基础结构权限时引发。A 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() ObjRef() ObjRef()

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

ObjRef(MarshalByRefObject, Type) ObjRef(MarshalByRefObject, Type) ObjRef(MarshalByRefObject, Type) 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(SerializationInfo, StreamingContext) ObjRef(SerializationInfo, StreamingContext) ObjRef(SerializationInfo, StreamingContext)

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

属性

ChannelInfo ChannelInfo ChannelInfo ChannelInfo

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

EnvoyInfo EnvoyInfo EnvoyInfo EnvoyInfo

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

TypeInfo TypeInfo TypeInfo TypeInfo

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

URI URI URI URI

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

方法

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

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

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

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

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext)

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

GetRealObject(StreamingContext) GetRealObject(StreamingContext) GetRealObject(StreamingContext) GetRealObject(StreamingContext)

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

GetType() GetType() GetType() GetType()

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

(Inherited from Object)
IsFromThisAppDomain() IsFromThisAppDomain() IsFromThisAppDomain() IsFromThisAppDomain()

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

IsFromThisProcess() IsFromThisProcess() IsFromThisProcess() IsFromThisProcess()

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

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

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

(Inherited from Object)
ToString() ToString() ToString() ToString()

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

(Inherited from Object)

安全性

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

适用于

另请参阅