AppDomain应用程序域 (MarshalByRefObject 类)
允许在支持远程处理的应用程序中跨应用程序域边界访问对象。
应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象直接通信。不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本,一种是使用代理交换消息。
MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。不是从 MarshalByRefObject 继承的对象根据值隐式封送。当远程应用程序引用根据值封送的对象时,将跨应用程序域边界传递该对象的副本。
MarshalByRefObject 对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问 MarshalByRefObject 时,会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。
当跨应用程序域边界使用类型时,类型必须是从 MarshalByRefObject 继承的,而且由于对象的成员在创建它们的应用程序域之外无法使用,所以不得复制对象的状态。
namespace AppDomain应用程序域
{
public class AppDomainTest : MarshalByRefObject
{
public int number = 0;
public void PrintAppDomain()
{
//AppDomain.CurrentDomain 获取当前 Thread 的当前应用程序域
//FriendlyName获取此应用程序域的友好名称
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
number += 1;
Console.WriteLine(number);
}
}
}
我定义一个AppDomainTest的类,继承自MarshalByRefObject对象,该对象是跨域远程访问的抽象基类,使用引用传递进行调用。
//创建新的应用程序域
Console.WriteLine("默认的程序域名称:\n" + AppDomain.CurrentDomain.FriendlyName);
AppDomain newdomain = AppDomain.CreateDomain("newaAppDomain");
object refobject = newdomain.CreateInstanceAndUnwrap("AppDomain应用程序域", "AppDomain应用程序域.AppDomainTest");
(refobject as AppDomain应用程序域.AppDomainTest).PrintAppDomain();
Console.ReadLine();
在默认的应用程序域的里面创建了一个新的应用程序域,域名为newaAppDomain,其实这个时候我们拿到仅仅是新应用程序的透明代理。
用程序域中调用新的应用程序的功能,设计到了跨域的访问,所以.NET通过ObjRef保存新的应用程序的位置信息以便在客户端生成代理。当ObjRef到达客户端之后,系统进行反序列化进行动态构造真实代理和透明代理,透明代理是动态创建的,必须继承自我们客户端调用的类型,可能用到了一些动态生成、编译的技术。ObjRef扩展自MarShalByRefObject对象,专门用来保存服务端对象的位置信息,并且是可序列化的。