什么叫应用程序域?(zhuan)
一:应用程序域 介绍:
"域",就是范围,环境,边界的意思,那么什么是应用程序域,官方给出的是这样的解释:操作系统和运行库环境通常会
在应用程序间提供某种形式的隔离.
应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,
运行库宿主负责在运行应用程序之前引导公共语言运行库。
应用程序域本质上就就是一种隔离,目的也就是使应用程序中运行的代码不能直接访问其他应用程序中的代码或资
源如果你需要访问其他应用程序中的对象时你就可以复制这些对象,或通过代理访问这些对象.
二:应用程序域和程序集
应用程序域和程序集之间的关系。在可以执行程序集中所包含的代码之前,必须将程序集加载到应用程序域中。
运行普通的应用程序会导致将几个程序集加载到一个应用程序域中。
程序集的加载方式决定其实时 (JIT) 编译代码是否可以在进程中由多个应用程序域共享,以及该程序集是否可以
从进程中卸载:
1:如果程序集是以非特定于域的形式进行加载,则共享相同安全授权集的所有应用程序域都可以共享相同的 JIT 编
译代码,从而减少应用程序所需的内存。但是,程序集则永远不能从进程中卸载。
2:如果程序集不是以非特定于域的形式进行加载,则它必须在加载的每个应用程序域中都是 JIT 编译的。但是,通过卸载程序集加载的所有应用程序域,可以从进程中卸载程序集。
三:AppDomain class 的使用
在.NET Framework 提供了AppDomain类来实现以创建和卸载域、创建域中各类型的实例.那么该类中有哪些方法呢,
下面我们进行简单的介绍:
1:CreateDomain :用于创新的应用程序域,
2:ExecuteAssembly or ExecuteAssemblyByName方法:执行应用程序域中的程序集。这是一个实例方法,因此它
可用来执行另一个应用程序域(您拥有对该域的引用)中的代码:
3:CreateInstanceAndUnwrap:在应用程序域中创建指定类型的实例,并返回一个代理。使用此方法以避免将包含创
建的类型的程序集加载到调用程序集.
4:Unload:执行域的正常关闭.只有应用程序域中正在运行的所有线程都已停止或域中不再有运行的线程之后,才卸载
该应用程序域。
四:编程例子:
以下这个例子显示了如何他创建应用程序域和关闭应用程序域:
using System;
using System.Reflection;
using System.Threading;
class Example
{
public static void Main()
{
string callingDomainName = Thread.GetDomain().FriendlyName;
string exeAssembly = Assembly.GetEntryAssembly().FullName;
// 设置一个新的应用程序域
AppDomainSetup a= new AppDomainSetup();
a.ApplicationBase =
System.Environment.CurrentDirectory;
a.DisallowBindingRedirects = false;
a.DisallowCodeDownload = true;
a.ConfigurationFile =
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
// 创建新的应用程序域
AppDomain b= AppDomain.CreateDomain("b", null, ads);
MarshalByRefType mbrt =
(MarshalByRefType) b.CreateInstanceAndUnwrap(
exeAssembly,
typeof(MarshalByRefType).FullName
);
mbrt.SomeMethod(callingDomainName);
// 关闭应用程序域
AppDomain.Unload(ad2);
try
{
// Call the method again. Note that this time it fails
// because the second AppDomain was unloaded.
mbrt.SomeMethod(callingDomainName);
Console.WriteLine("Sucessful call.");
}
catch(AppDomainUnloadedException)
{
Console.WriteLine("Failed call; this is expected.");
}
}
}
public class MarshalByRefType : MarshalByRefObject
{
//通过代理调用方法
public void SomeMethod(string callingDomainName)
{
AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}",
a.ApplicationName,
a.ApplicationBase,
a.ConfigurationFile
);
Console.WriteLine("Calling from '{0}' to '{1}'.", callingDomainName,
Thread.GetDomain().FriendlName );
}
}