RemotingServices.Marshal 方法

定义

将给定 MarshalByRefObject 转换为 ObjRef 类的实例,该实例可以序列化,以便在应用程序域与网络之间传输。

重载

Marshal(MarshalByRefObject)

获取 MarshalByRefObject,将其注册到远程处理基础结构,并将其转换为 ObjRef 类的实例。

Marshal(MarshalByRefObject, String)

将给定 MarshalByRefObject 转换为具有指定 URI 的 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

参数

Obj
MarshalByRefObject

要转换的对象。

返回

表示 Obj 参数中指定的对象的 ObjRef 类的实例。

例外

Obj 参数是对象代理。

调用堆栈中至少有一个更高的调用方无权配置远程处理类型和通道。

注解

ObjRef 是用于跨应用程序域边界传输对象引用的对象可序列化表示形式。 为对象创建 ObjRef 称为封送处理。 ObjRef 可以通过通道传输到另一个应用程序域(可能在另一个进程或计算机上)。 在其他应用程序域中,必须分析 ObjRef 才能为对象创建代理,通常连接到实际对象。 此操作称为取消划界。

ObjRef 包含描述要封送的对象 Type 和类的信息、唯一标识特定对象实例的 URI,以及有关如何访问对象所在远程处理细分的通信相关信息。

在封送处理期间,将使用当前线程中的上下文,而不是创建对象时处于活动状态的上下文。 如果未通过 SetObjectUriForMarshal 方法显式设置 URI,则远程标识基础结构会自动生成该 URI。

由于以下两个原因之一,无法将 URI 与代理相关联:URI 是在服务器端为其表示的对象生成的,或者对象是众所周知的,在这种情况下,URI 是已知的。 因此,如果 Obj 参数是代理,则会引发异常。 对于自定义代理,此限制会放宽,因为透明代理被视为服务器对象。

另请参阅

适用于

Marshal(MarshalByRefObject, String)

将给定 MarshalByRefObject 转换为具有指定 URI 的 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

参数

Obj
MarshalByRefObject

要转换的对象。

URI
String

要初始化新 ObjRef的指定 URI。 可以 null

返回

表示 Obj 参数中指定的对象的 ObjRef 类的实例。

例外

Obj 是对象代理,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 才能为对象创建代理,通常连接到实际对象。 此操作称为取消划界。

ObjRef 包含描述要封送的对象 Type 和类的信息、唯一标识特定对象实例的 URI,以及有关如何访问对象所在远程处理细分的通信相关信息。

在封送处理期间,将使用当前线程中的上下文,而不是创建对象时处于活动状态的上下文。

由于以下两个原因之一,无法将 URI 与代理相关联:URI 是在服务器端为其表示的对象生成的,或者对象是众所周知的,在这种情况下,URI 是已知的。 因此,如果 Obj 参数是代理,则会引发异常。 对于自定义代理,此限制会放宽,因为透明代理被视为服务器对象。

另请参阅

适用于

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

参数

Obj
MarshalByRefObject

要转换为 ObjRef的对象。

ObjURI
String

Obj 参数中指定的对象的 URI 封送。 可以 null

RequestedType
Type

Type Obj 封送为。 可以 null

返回

表示 Obj 参数中指定的对象的 ObjRef 类的实例。

例外

Obj 是远程对象的代理,ObjUri 参数不 null

调用堆栈中至少有一个更高的调用方无权配置远程处理类型和通道。

注解

ObjRef 是用于跨应用程序域边界传输对象引用的对象可序列化表示形式。 为对象创建 ObjRef 称为封送处理。 ObjRef 可以通过通道传输到另一个应用程序域(可能在另一个进程或计算机上)。 在其他应用程序域中,必须分析 ObjRef 才能为对象创建代理,通常连接到实际对象。 此操作称为取消划界。

ObjRef 包含描述要封送的对象 Type 和类的信息、唯一标识特定对象实例的 URI,以及有关如何访问对象所在远程处理细分的通信相关信息。

远程处理基础结构使用指定的 Type 来限制公开的类型层次结构的范围。 例如,如果对象 A 派生自对象 B,该对象派生自对象 C,并且调用 Marshal,则客户端可以在 C 和 B 之间强制转换代理,但不能强制转换为 A。

在封送处理期间,将使用当前线程中的上下文,而不是创建对象时处于活动状态的上下文。

由于以下两个原因之一,无法将 URI 与代理相关联:URI 是在服务器端为其表示的对象生成的,或者对象是众所周知的,在这种情况下,URI 是已知的。 因此,如果 Obj 参数是代理,则会引发异常。 对于自定义代理,此限制会放宽,因为透明代理被视为服务器对象。

另请参阅

适用于