在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用.Net建立的可执行程序*.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域是.Net引入的一个新概念,它比进程所占用的资源要少,可以被看做是一个轻量级的进程。一个应用程序域可以有多个线程,一个线程也可以穿梭于多个应用程序域。 在一个进程中可以包含多个应用程序域,一个应用程序域可以装在一个可执行程序(*.exe)或者多个程序集(*.dll)。这样可以使应用程序域之间实现深度隔离,即使进程中的某个应用程序域出现错误,也不会影响其他应用程序域的正常运作。 当一个程序集同时被多个应用程序域调用时,会出现两种情况:
应用程序域:(Application Domain,简称App Domain)一组程序集的一个逻辑容器,进程中的一个逻辑分区。通常由运行时宿主创建和操作。AppDomain唯一的作用就是进行隔离。 具体功能:
适合使用AppDomain的条件:
在System命名空间下就存在AppDomain类,用于管理应用程序域。 AppDomain的常用属性:
AppDomain的常用方法:
AppDomain事件:
二、在AppDomain中加载程序集通过CreateDomain方法可以建立一个新的应用程序域。 下面给出一个使用CreateDomain建立一个应用程序域,并使用Load方法加载程序集Model.dll。 最后使用GetAssemblies方法,列举此应用程序域中的所有程序集。 public class Program { static void Main(string[] args) { var domain = AppDomain.CreateDomain("MyAppDomain"); domain.Load(@"控制台 - 学习测试"); foreach (var assembly in domain.GetAssemblies()) { Console.WriteLine(assembly.FullName); } Console.ReadKey(); } } 输出结果如下:
注意:当加载程序集后,就无法把它从AppDomain中卸载,只能把整个AppDomain卸载。 当需要在AppDomain加载可执行程序时,可以使用ExecuteAssembly方法。 如,建一个控制台程序: class Program { static void Main(string[] args) { Console.WriteLine("供应用程序域执行!"); Console.ReadKey(); } } 将上面程序生成的路径保存到:C:\Users\ChenZhuo\Desktop\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe 下面我们创建一个应用程序域并执行上面那个程序集: public class Program { static void Main(string[] args) { var domain = AppDomain.CreateDomain("MyAppDomain"); 输出结果如下:
三、卸载应用程序域通过Unload可以卸载AppDomain,在AppDomain卸载时将会触发DomainUnload事件。 下面使用CreateDomain建立一个名为NewAppDomain的应用程序域。然后建立AssemblyLoad事件处理方法,在程序集加载时显示程序集的信息。最后建立DomainUnload事件处理方法,在AppDomain卸载时显示卸载信息。 class Program { static void Main(string[] args) { //新建一个应用程序域 AppDomain MyDomain = AppDomain.CreateDomain("domain"); //建立AssemblyLoad事件处理方法 MyDomain.AssemblyLoad += (sender, e) => { Console.WriteLine("程序集正在加载!" + e.LoadedAssembly.FullName); }; //建立AssemblyUnload事件处理方法 MyDomain.DomainUnload += (sender, e) => { Console.WriteLine("程序集正在卸载!"); }; //加载程序集 MyDomain.Load("MySpace"); Thread.Sleep(1000); Console.WriteLine("正在工作中!"); //卸载程序集 AppDomain.Unload(MyDomain); Console.ReadKey(); } } 输出结果如下:
四、在AppDomain中建立程序集中指定类的对象使用CreateInstance方法,能建立程序集中指定类的对象。但使用此方法将返回一个ObjectHandle对象,若要将此值转换为原类型,可调用UnWrap方法。 下面例子利用MySpace.dll程序集中的MySpace.Person对象。 namespace ConsoleApplication1 { public class Program { static void Main(string[] args) { var person = (Person)AppDomain.CurrentDomain.CreateInstance("MySpace", "MySpace.Person").Unwrap(); person.Id = 1; person.Name = "张飞"; Console.WriteLine(person.Id + " : " + person.Name); Console.ReadKey(); } } } Person: namespace MySpace { public class Person { public int Id { get; set; } public string Name { get; set; } } } 输出结果如下:
|
请发表评论