在一个面向对象的非远程环境中调用方法时会发生什么。逻辑上说,调用对象方法的时候,就是在给对象发信号,通知它执行某个函数。在某种程度上是在给对象发送消息,而这个消息是由作为参数传递给那个方法的一些数值所构成的。方法的入口点地址就是消息的目的地址。调用方在非常低的层次上把方法的参数连同方法完成时应当返回的地址一起推入堆栈,然后,调用方将应用程序的指令指针设为方法的入口点,从而调用该方法。由于调用方和方法都遵循调用规范,因此方法知道如何按正确的顺序从堆栈获取其参数。实际上,堆栈起到了方法调用之间通信传输层的作用,在调用方和被调用方之间传递函数参数并返回结果。
将方法调用的相关信息封装在一个消息对象中是以面向对象的方式抽象化并模型化“方法调用作为消息”的概念。消息对象传递方法的名称、参数以及从调用方到被调用方的其他方法调用的相关信息。.NET Remoting使用这样的方案让分布式对象之间进行交互。消息对象封装了所有的方法调用、输入参数、构造函数调用、方法返回值、输出参数、异常,等等。
.NET Remoting消息对象类型封装在一个消息对象实现了System.Runtime.Remoting.Message.IMessage接口并且可序列化。IMessage定义了一个IDictionary类型的属性成员,名为Properties。这个词典保存着描述被调用方法的各个方面的命名属性和值,一般它包含着诸如远程对象的URI、被调用方法的名称以及任何方法的参数这样的信息。当.NET Remoting基础设施穿越.NET Remoting边界传递消息的时候,它将词典里的值序列化。.NET Remoting基础设施从IMessage派生了集中消息类型。
注意 请记住,只有序列化类型的实例才能穿过.NET Remoting边界。谨记 .NET Remoting基础设施会序列化消息对象,从而让它穿过.NET Remoting边界。这意味着,如果希望消息对象的Properties词典中存放的任何对象都能与消息一同穿越.NET Remoting边界,这些对象都必须序列化。 |