AppDomain以及如何改变web.config / App.config位置
概念:
AppDomain (应用程序域) 是.NET框架独有的概念。找不到其他技术体系中贴切的参照概念,是微软自己的东西。AppDomain,它是一个应用程序在其中执行的独立环境,为执行托管代码提供隔离、卸载和安全边界。
AppDomain的独立性:
AppDomain是既是容器又是边界线。.NET运行时间使用AppDomain作为代码和数据的容器,就像操作系统一个过程作为代码和数据的容器一样。当操作系统使用一个过程来分离不整齐的代码时,.NET运行时间使用一个AppDomain来分离在一个安全边线内的代码。每一个AppDomain都由.NET的框架分配了专用的存储区(应用域局部存储)。任何对象都可以访问自己当前所在的AppDomain的局部存储区,这个局部存储区被整个AppDomain中的对象共享,也包括进入AppDomain的线程(运行于同一个AppDomain的线程可以通过这个局部存储进行通信)。
进程和AppDomain的关系:
属于一对多的关系,即一个进程中可以有多个AppDomain,但是AppDomain只能存在于某个进程中。缺省情况下,如果你没有自己创建多个AppDomain,一个进程启动后自动创建一个AppDomain。多个AppDomain运行在同一个.NET的进程中,好处就是可以降低系统消耗,而且不同的AppDomain之间互相隔离,具有更好的独立性和安全性。
线程和AppDomain的关系:
在应用程序域和线程之间没有一对一的关联。多个线程可以属于一个应用程序域,尽管给定的线程并不局限于一个应用程序域,但在任何给定时间,线程都在一个应用程序域中执行。线程执行可以涉及多个AppDomain,但某个特定时刻,线程仅存在于一个AppDomain中,且线程可以进入其他的AppDomain。某个程序集的某个实例属于具体的AppDomain,由AppDomain在自己的范围内加载,并按照程序集创建相应的对象。AppDomain是程序集的执行环境,同时程序集作为静态实体,可以被多个AppDomain加载执行。
AppDomain的创建和卸载:
setup.LoaderOptimization = LoaderOptimization.SingleDomain;
setup.ApplicationBase = "(some directory)";
setup.ConfigurationFile = "(some file)";
AppDomain domain = AppDomain.CreateDomain ( "newDomain", null, setup );
domain.ExecuteAssembly ( "C:\\NewDomain.exe" );
AppDomain.Unload ( domain );
那些情况下需要使用AppDomain:
其实在一般情况下我们是不需要理会appDomain的,不过,出现此概念在.NET中决非多余,有着自己存在的理由,那么具体载那些情境下要使用appDomain呢?
- 需要隔离的程序集,譬如一些特别容易引起崩溃的代码可以考虑单独运行于一个特定的appDomain
- 不同安全级别的程序集,如果需要为自己的代码划分安全执行的边界,可以考虑将不同安全级别的代码单独创建于某个设定了不同安全信息的appDomain
- 从性能上考虑,有些程序集可能会消耗大量资源,尽管在托管环境下,基本上不存在资源消耗漏洞,但是总会存在特定时间访问密集造成消耗大量资源的情况,这时可以考虑创建单独的appDomain,在资源消耗超过临界点后进行appDomain的卸载,适应系统运行要求。Asp.net中利用不同得appDomain来提供支持就是为了防止一个应用程序的崩溃影响其他asp.net应用程序,同时,在不重新启动的系统不重新启动IIS不影响asp.net自身服务提供的情况下将一个appDomain卸掉同时启动新的appDomain,理想情况下可以实现web系统的长时间在线(这以往是昂贵的unix的特性,终于被MS“借鉴”了)。
- 不同版本的同一应用程序集的同时运行。这个在COM时代是一个大问题,现在通过appDomain,实现了在一个进程中执行版本不同的两个程序集,可以做到良好的兼容性。
- 动态加载一些程序。例如动态创建一个AppDomain启动一个后台监控程序,即使崩溃了也不会影响主进程的运行。
改变AppDomain的属性:
使用AppDomain类的CurrentDomain属性,可以检查关于代码正在运行的AppDomain的属性。
如何改变web.config / App.config位置:
Web.config/ App.config / *.exe.config都默认在应用程序集的相同目录下,.net 2.0 configuration非常依赖这个配置文件,如果我们想把它移到其他目录,比如”C:"Documents and Settings"myusername"Application Data"”下,而又不影响.net 2.0 configuration等等所有依赖这个配置文件的等你哦关系,怎么做呢?可以设置AppDomain的属性:if(System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile != newConfigFilePath)
AppDomain.CurrentDomain.SetData ( "APP_CONFIG_FILE", newConfigFilePath );