先推荐一些Appdomain的资料
1.AppDomain应用程序域的msdn定义
http://msdn.microsoft.com/library/ZH-CN/113A8BBF-6875-4A72-A49D-CA2D92E19CC8(VS.100)
2.理解AppDomain
http://www.360doc.com/content/05/0929/09/73_15757.shtml
3.C#强化系列文章六:应用程序域(AppDomain)浅析
http://www.csharpwin.com/csharpspace/124.shtml
4.基于AppDomain的"插件式"开发
http://www.cnblogs.com/kongyiyun/archive/2011/08/01/2123459.html
看过以后, 基本就明白了, 一般情况下我们是不需要理会AppDomain的,它就像空气一样,每时每刻都在用它,但又可以视而不见. 因为CLR在启动的时候会创建系统域(System Domain),共享域(Shared Domain)和默认域(Default Domain),系统域与共享域对于用户是不可见的,默认域也可以说是当前域,它承载了当前应用程序的各类信息(堆栈),所以,我们的一切操作都是在这个默认域上进行.
运行下面的程序就可以获得一些当前应用程序域的信息:
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
//获取当前的应用程序域
AppDomain currentApp = AppDomain.CurrentDomain;
Console.WriteLine("FriendlyName:" + currentApp.FriendlyName);
Console.WriteLine("BaseDirectory:" + currentApp.BaseDirectory);
Console.WriteLine("Id:" + currentApp.Id);
Console.ReadKey();
}
}
}
看到这个.vshost.exe, 感到有些熟悉, 它存在bin\debug目录下, 它的名称是承载进程 (vshost.exe), 主要作用是帮助调试, msdn定义如下:
http://msdn.microsoft.com/zh-cn/library/ms185331(v=VS.100).aspx
如何创建, 卸载域?
在.NET中提供了AppDomain类为执行托管代码提供隔离、卸载和安全边界。
AppDomainSetup info = new AppDomainSetup();
info.LoaderOptimization = LoaderOptimization.SingleDomain;
AppDomain domain = AppDomain.CreateDomain("lzd",null,info);
domain.ExecuteAssembly(@"D:\test.exe");
AppDomain.Unload(domain);
1、使用AppDomainSetup类定义新域的属性,比如可以设置应用程序的根目录,设置被加载程序的类别。
例子中使用的是SingleDomain表示加载程序不得在应用程序域之间共享内部资源,还可以使用MultiDomain、MultiDomainHost等其他属性
2、在第四行创建一个名字为MyDomain的新域
3、在第5行在新域内部执行一个应用程序
4、第6行卸载这个新域
通过这样创建后,新域的执行就算出现系统异常也不会影响到原来域的执行,那么就可以做类似WatchDog(监控子程序,一旦退出就重启)的程序了
笔者也没有在项目中实际用过Appdomain, 但看资料可间接得知, 它的主要用途在于: 插件开发, 隔离容错, 调用不同版本dll等.