AppDomain 学习笔记

先推荐一些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等.

 

posted on 2011-09-26 17:48  BobLiu  阅读(576)  评论(2编辑  收藏  举报