ObjRef 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
儲存產生 Proxy 所需的所有相關資訊,以便與遠端物件通訊。
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
- 繼承
-
ObjRef
- 屬性
- 實作
範例
下列程式代碼範例示範如何使用自訂 ObjRef。 若要檢視測試自定義 ObjRef的啟用碼,請參閱 方法的 RegisterWellKnownServiceType 範例。
// 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
備註
ObjRef是物件的可串行化表示法,可擴充 MarshalByRefObject (MBR) 。 ObjRef用來跨AppDomain界限傳輸對象參考。 ObjRef建立對象的 稱為封送處理。 您可以ObjRef藉由向遠端基礎結構註冊 MBR 物件, (查看RemotingConfiguration和 RemotingServices.Marshal) 或隱含方式,藉由在呼叫遠端物件時將 MBR 物件當做參數傳遞,藉此建立 (封送MarshalByRefObject處理) 。 遠端處理會使用 ObjRef 對象來儲存和傳輸有關遠端的所有相關信息 MarshalByRefObject 。
ObjRef包含的資訊Type描述要封送處理之物件的 和類別、其確切位置,以及如何到達物件所在遠端細分的通訊相關信息。
實作的 MarshalByRefObject 類別封送處理之後, ObjRef 表示該類別會透過通道傳輸到另一個應用程式域,可能是在另一個進程或計算機中。 ObjRef還原串行化 (在目標應用程式域中看到 XML 和 SOAP 串行化) 時,會剖析為遠端 MBR 物件建立透明 Proxy。 這項作業稱為 unmarshaling。
透明 Proxy 是一個物件,可提供實際對象位於客戶端空間中的假像。 其可藉由使用遠端基礎結構,將呼叫轉送至實際對象來達成此目的。 透明 Proxy 本身是由 型 RealProxy別的 Managed 運行時間類別實例所存放。 會 RealProxy 實作從透明 Proxy 轉送作業所需的一部分功能。
您可以使用 Proxy 物件,而不考慮 內的 AppDomain任何遠端細分。 應用程式不需要區分 Proxy 參考和對象參考。 不過,服務提供者需要處理啟用、存留期管理和交易等問題,
這個類別會在類別層級建立連結需求和繼承需求。 SecurityException當立即呼叫端或衍生類別沒有基礎結構權限時,就會擲回 。 如需安全性需求的詳細資訊,請參閱 連結需求 和 繼承需求。
建構函式
ObjRef() |
使用預設值,初始化 ObjRef 類別的新執行個體。 |
ObjRef(MarshalByRefObject, Type) |
初始化 ObjRef 類別的新執行個體,以參考所指定 MarshalByRefObject 的指定 Type。 |
ObjRef(SerializationInfo, StreamingContext) |
從序列化資料中,初始化 ObjRef 類別的新執行個體。 |
屬性
ChannelInfo |
取得或設定 IChannelInfo 的 ObjRef。 |
EnvoyInfo |
取得或設定 IEnvoyInfo 的 ObjRef。 |
TypeInfo |
取得或設定 IRemotingTypeInfo 所描述之物件的 ObjRef。 |
URI |
取得或設定特定物件執行個體的 URI。 |
方法
Equals(Object) |
判斷指定的物件是否等於目前的物件。 (繼承來源 Object) |
GetHashCode() |
做為預設雜湊函式。 (繼承來源 Object) |
GetObjectData(SerializationInfo, StreamingContext) |
以序列化目前 SerializationInfo 執行個體所需的資料,填入 (Populate) 指定的 ObjRef。 |
GetRealObject(StreamingContext) |
傳回 ObjRef 所描述之遠端物件的參考。 |
GetType() |
取得目前執行個體的 Type。 (繼承來源 Object) |
IsFromThisAppDomain() | |
IsFromThisProcess() |
傳回布林值,指出目前的 ObjRef 執行個體是否參考位於目前處理序中的物件。 |
MemberwiseClone() |
建立目前 Object 的淺層複製。 (繼承來源 Object) |
ToString() |
傳回代表目前物件的字串。 (繼承來源 Object) |