使用.NET建立的可执行程序 .exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域 是.NET引入的一个新概念,它比进程所占用的资源要少,可以被看作是一个轻量级的进程。 **在一个进程中可以包含多个应用程序域,一个应用程序域可以装载一个可执行程序(.exe)或者多个程序集(*.dll)**。这样可以 使应用程序域之间实现深度隔离,即使进程中的某个应用程序域出现错误,也不会影响其他应用程序域的正常运作。
当一个程序集同时被多个应用程序域调用时,会出现两种情况:
第一种情况:CLR分别为不同的应用程序域加载此程序集。
第二种情况:CLR把此程序集加载到所有的应用程序域之外,并实现程序集共享,此情况比较特殊,被称作为Domain Neutral。
var appDomain = AppDomain.CreateDomain(“NewAppDomain”);
appDomain.Load(“Model”); foreach (var assembly in
appDomain.GetAssemblies())
Console.WriteLine(string.Format(“{0}\n----------------------------”,
assembly.FullName)); Console.ReadKey();
当需要在AppDomain加载可执行程序时,可以使用ExecuteAssembly方法。
AppDomain.ExecuteAssembly(“Example.exe”);
在AppDomain中建立程序集中指定类的对象
使用CreateInstance方法,能建立程序集中指定类的对像。但使用此方法将返回一个ObjectHandle对象,若要将此值转化为原类 型,可调用Unwrap方法。 下面例子会建立Model.dll程序集中的Model.Person对象。
namespace Test {
public class Program
{
static void Main(string[] args) {
var person=(Person)AppDomain.CurrentDomain .CreateInstance(“Model”,“Model.Person”).Unwrap();
person.ID = 1;
person.Name = “Leslie”;
person.Age = 29;
Console.WriteLine(string.Format(“{0}'s age is {1}!”,person.Name,person.Age));
Console.ReadKey();
}
}
}
namespace Model {
public class Person
{
public int ID {
get; set;
}
public string Name {
get; set;
}
public int Age {
get; set;
}
}
}
跨AppDomain运行代码
在应用程序域之间的数据是相对独立的,当需要在其他AppDomain当中执行当前AppDomain中的程序集代码时,可以使用 CrossAppDomainDelegate委托。把CrossAppDomainDelegate委托绑定方法以后,通过AppDomain的DoCallBack方法即可 执行委托。