RemotingServices.Marshal 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
將指定的 MarshalByRefObject 轉換成 ObjRef 類別的實例,可串行化以在應用程式域與網路之間傳輸。
多載
Marshal(MarshalByRefObject) |
取得 MarshalByRefObject,向遠端基礎結構註冊,並將它轉換成 ObjRef 類別的實例。 |
Marshal(MarshalByRefObject, String) |
使用指定的 URI,將指定的 MarshalByRefObject 轉換成 ObjRef 類別的實例。 |
Marshal(MarshalByRefObject, String, Type) |
取得 MarshalByRefObject,並將它轉換成具有指定 URI 的 ObjRef 類別實例,以及提供的 Type。 |
Marshal(MarshalByRefObject)
取得 MarshalByRefObject,向遠端基礎結構註冊,並將它轉換成 ObjRef 類別的實例。
public:
static System::Runtime::Remoting::ObjRef ^ Marshal(MarshalByRefObject ^ Obj);
public static System.Runtime.Remoting.ObjRef Marshal (MarshalByRefObject Obj);
static member Marshal : MarshalByRefObject -> System.Runtime.Remoting.ObjRef
Public Shared Function Marshal (Obj As MarshalByRefObject) As ObjRef
參數
要轉換的物件。
傳回
ObjRef 類別的實例,表示在 Obj
參數中指定的物件。
例外狀況
Obj
參數是物件 Proxy。
呼叫堆疊中至少有一個較高的呼叫端沒有設定遠端類型和通道的許可權。
備註
ObjRef 是物件可串行化的表示法,用來跨應用程式域界限傳輸對象參考。 為物件建立 ObjRef 稱為封送處理。 ObjRef 可以透過通道傳輸到另一個應用程式域(可能在另一個進程或計算機上)。 在其他應用程式域中,必須剖析 ObjRef,才能建立物件的 Proxy,通常連線到實際物件。 此作業稱為「取消分界」。
ObjRef 包含資訊,描述要封送處理之物件的 Type 和類別、可唯一識別特定物件實例的 URI,以及有關如何到達物件所在遠端細分的通訊相關信息。
在封送處理期間,會使用目前線程的內容,而不是建立物件時使用中的內容。 如果 uri 不是由 SetObjectUriForMarshal 方法明確設定,它就會由遠端身分識別基礎結構自動產生。
您無法基於下列兩個原因之一,將 URI 與 Proxy 產生:在伺服器端針對它所代表的對象產生 URI,或已知物件,在此情況下,URI 為已知。 因此,如果 Obj
參數是 Proxy,則會擲回例外狀況。 對於自定義 Proxy 而言,這項限制會放寬,因為透明 Proxy 會被視為伺服器物件。
另請參閱
適用於
Marshal(MarshalByRefObject, String)
使用指定的 URI,將指定的 MarshalByRefObject 轉換成 ObjRef 類別的實例。
public:
static System::Runtime::Remoting::ObjRef ^ Marshal(MarshalByRefObject ^ Obj, System::String ^ URI);
public static System.Runtime.Remoting.ObjRef Marshal (MarshalByRefObject Obj, string URI);
static member Marshal : MarshalByRefObject * string -> System.Runtime.Remoting.ObjRef
Public Shared Function Marshal (Obj As MarshalByRefObject, URI As String) As ObjRef
參數
要轉換的物件。
傳回
ObjRef 類別的實例,表示在 Obj
參數中指定的物件。
例外狀況
Obj
是物件 Proxy,而且 URI
參數不會 null
。
呼叫堆疊中至少有一個較高的呼叫端沒有設定遠端類型和通道的許可權。
範例
下列程式代碼範例示範如何使用目前的 Marshal 方法來封送處理指定的物件。
TcpChannel^ channel = gcnew TcpChannel( 9000 );
ChannelServices::RegisterChannel( channel );
SampleWellKnown ^ objectWellKnown = gcnew SampleWellKnown;
// After the channel is registered, the Object* needs to be registered
// with the remoting infrastructure. So, Marshal is called.
ObjRef^ objrefWellKnown = RemotingServices::Marshal( objectWellKnown, "objectWellKnownUri" );
Console::WriteLine( "An instance of SampleWellKnown type is published at {0}.", objrefWellKnown->URI );
Console::WriteLine( "Press enter to unregister SampleWellKnown, so that it is no longer available on this channel." );
Console::ReadLine();
RemotingServices::Disconnect( objectWellKnown );
Console::WriteLine( "Press enter to end the server process." );
Console::ReadLine();
TcpChannel channel = new TcpChannel(9000);
ChannelServices.RegisterChannel(channel);
SampleWellKnown objectWellKnown = new SampleWellKnown();
// After the channel is registered, the object needs to be registered
// with the remoting infrastructure. So, Marshal is called.
ObjRef objrefWellKnown = RemotingServices.Marshal(objectWellKnown, "objectWellKnownUri");
Console.WriteLine("An instance of SampleWellKnown type is published at {0}.", objrefWellKnown.URI);
Console.WriteLine("Press enter to unregister SampleWellKnown, so that it is no longer available on this channel.");
Console.ReadLine();
RemotingServices.Disconnect(objectWellKnown);
Console.WriteLine("Press enter to end the server process.");
Console.ReadLine();
Dim channel As New TcpChannel(9000)
ChannelServices.RegisterChannel(channel)
Dim objectWellKnown As New SampleWellKnown()
' After the channel is registered, the object needs to be registered
' with the remoting infrastructure. So, Marshal is called.
Dim objrefWellKnown As ObjRef = RemotingServices.Marshal(objectWellKnown, "objectWellKnownUri")
Console.WriteLine("An instance of SampleWellKnown type is published at {0}.", objrefWellKnown.URI)
Console.WriteLine("Press enter to unregister SampleWellKnown, so that it is no longer available on this channel.")
Console.ReadLine()
RemotingServices.Disconnect(objectWellKnown)
Console.WriteLine("Press enter to end the server process.")
Console.ReadLine()
備註
ObjRef 是物件可串行化的表示法,用來跨應用程式域界限傳輸對象參考。 為物件建立 ObjRef 稱為封送處理。 ObjRef 可以透過通道傳輸到另一個應用程式域(可能在另一個進程或計算機上)。 在其他應用程式域中,必須剖析 ObjRef,才能建立物件的 Proxy,通常連線到實際物件。 此作業稱為「取消分界」。
ObjRef 包含資訊,描述要封送處理之物件的 Type 和類別、可唯一識別特定物件實例的 URI,以及有關如何到達物件所在遠端細分的通訊相關信息。
在封送處理期間,會使用目前線程的內容,而不是建立物件時使用中的內容。
您無法基於下列兩個原因之一,將 URI 與 Proxy 產生:在伺服器端針對它所代表的對象產生 URI,或已知物件,在此情況下,URI 為已知。 因此,如果 Obj
參數是 Proxy,則會擲回例外狀況。 對於自定義 Proxy 而言,這項限制會放寬,因為透明 Proxy 會被視為伺服器物件。
另請參閱
適用於
Marshal(MarshalByRefObject, String, Type)
取得 MarshalByRefObject,並將它轉換成具有指定 URI 的 ObjRef 類別實例,以及提供的 Type。
public:
static System::Runtime::Remoting::ObjRef ^ Marshal(MarshalByRefObject ^ Obj, System::String ^ ObjURI, Type ^ RequestedType);
public static System.Runtime.Remoting.ObjRef Marshal (MarshalByRefObject Obj, string ObjURI, Type RequestedType);
static member Marshal : MarshalByRefObject * string * Type -> System.Runtime.Remoting.ObjRef
Public Shared Function Marshal (Obj As MarshalByRefObject, ObjURI As String, RequestedType As Type) As ObjRef
參數
要轉換成 ObjRef的物件。
- ObjURI
- String
Obj
參數中指定的物件 URI 會以封送處理。 可以是 null
。
傳回
ObjRef 類別的實例,表示在 Obj
參數中指定的物件。
例外狀況
Obj
是遠端物件的 Proxy,而且 ObjUri
參數不會 null
。
呼叫堆疊中至少有一個較高的呼叫端沒有設定遠端類型和通道的許可權。
備註
ObjRef 是物件可串行化的表示法,用來跨應用程式域界限傳輸對象參考。 為物件建立 ObjRef 稱為封送處理。 ObjRef 可以透過通道傳輸到另一個應用程式域(可能在另一個進程或計算機上)。 在其他應用程式域中,必須剖析 ObjRef,才能建立物件的 Proxy,通常連線到實際物件。 此作業稱為「取消分界」。
ObjRef 包含資訊,描述要封送處理之物件的 Type 和類別、可唯一識別特定物件實例的 URI,以及有關如何到達物件所在遠端細分的通訊相關信息。
遠端基礎結構會使用指定的 Type 來限制公開類型階層的範圍。 例如,如果物件 A 衍生自物件 B,其衍生自物件 C,且呼叫 Marshal,則用戶端可以將 C 與 B 之間的 Proxy 轉換為 A。
在封送處理期間,會使用目前線程的內容,而不是建立物件時使用中的內容。
您無法基於下列兩個原因之一,將 URI 與 Proxy 產生:在伺服器端針對它所代表的對象產生 URI,或已知物件,在此情況下,URI 為已知。 因此,如果 Obj
參數是 Proxy,則會擲回例外狀況。 對於自定義 Proxy 而言,這項限制會放寬,因為透明 Proxy 會被視為伺服器物件。