AppDomain 相似于一个轻量级进程,它是 .net / mono 代码运行时的一个逻辑容器。web
通常状况下,咱们开发的代码都运行在“运行时”为咱们建立的 AppDomain 中(即默认 AppDomain),察觉不到 AppDomain 的存在,也不太须要关注 AppDomain。但在另一些状况下,有可能须要在应用程序中建立其余 AppDomain,例如:安全
- 动态卸载程序集:咱们知道在 .net / mono 中,能够在运行时动态加载程序集,但却没法将已加载到内存的特定程序集卸载掉,这意味着在程序运行期间没法更新被加载的程序集。而这个功能在某些程序设计中是很是必要的,最多见的就是插件架构。此外,因为已加载的程序集要在应用程序结束时才被释放,这也形成了没必要要的内存占用。如今,经过 AppDomain 能够实现此目的。
- 实现程序集隔离:一些容易引发崩溃的代码能够考虑单独运行在一个 AppDomain 中。譬如,Asp.net 中就利用不一样的 AppDomain 来防止一个应用程序的崩溃影响其余 Asp.net 应用程序,同时还能够在不重启系统、不重启 IIS、不影响 Asp.net 自身服务的状况下将一个 AppDomain 卸载掉,而后启动新的 AppDomain,理想状况下能够实现 web 系统的长时间在线(这以往是昂贵的 unix 的特性,如今终于被微软“借鉴”了)。
- 限制代码安全权限:在一些状况下,为了防止某些非受信代码可能对其余 AppDomain 形成的潜在有害影响,能够对其应用不一样的安全级别,以确保关键资源的安全性。
- 加载相同程序集的不一样版本:这个在 COM 时代是一个大问题,如今经过 AppDomain,便可实如今一个进程中同时加载不一样版本的两个程序集,且能够作到良好的兼容性。
- 有效利用资源:从性能上考虑,有些程序集可能会消耗大量资源,尽管在托管环境下基本上不存在资源消耗漏洞,但总会存在特定时间密集访问、形成大量资源消耗的状况,这时能够考虑建立单独的 AppDomain,在资源消耗超过临界点后卸载 AppDomain,以适应系统运行要求。
- 减小内存占用:在.net 中容许不一样 AppDomain 共享程序集,前提是这些程序集必须具备强名称,且位于 GAC 中。例如,在 Asp.net 中,程序集共享策略默认使用的是 MultiDomainHost,这意味着 GAC 中全部程序集都将做为共享 (domain neutral) 程序集被全部 AppDomain(即全部 Asp.Net 应用程序)共用,咱们能够想象获得这能够带来多少内存节约。