我在采访中不断被问及AppDomains,我知道基础知识:
它们是应用程序中的隔离级别(使它们与应用程序不同)
他们可以有线程(使它们与线程不同)
一个appdomain中的异常不会影响另一个
appdomains无法访问彼此的内存
每个appdomain都可以有不同的安全性
我仍然没有得到使他们成为必要的东西.当你使用一个时,我正在寻找一个合理的具体情况.
回答:
不受信任的代码
核心应用程序受保护
不受信任的/第三方插件被禁止通过隔离在具有安全限制的单独appdomain中来破坏共享内存和对注册表或硬盘驱动器的非授权访问,从而保护应用程序或服务器.例如ASP.NET和SQL Server托管组件代码
可信代码
稳定性
应用程序分为安全,独立的特性/功能
架构灵活性
自由在单个CLR实例或每个程序中运行多个应用程序.
还要别的吗?
可能最常见的是加载包含来自不受信任方的插件代码的程序集.代码在自己的AppDomain中运行,隔离应用程序.
此外,无法卸载特定程序集,但您可以卸载AppDomains.
对于完整的纲要,克里斯布鲁姆有一个大量的博客条目:
http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx
AppDomains的另一个好处(正如您在问题中提到的)是您加载到其中的代码可以使用不同的安全权限运行.例如,我编写了一个动态加载DLL的应用程序.我是一名教练,这些是我正在加载的学生DLL.我不想让一些心怀不满的学生消灭我的硬盘或破坏我的注册表,所以我将他们的DLL中的代码加载到一个单独的AppDomain中,该AppDomain没有文件IO权限或注册表编辑权限甚至是显示新窗口的权限(它实际上只有执行权限).
我认为拥有AppDomains的主要动机是CLR设计人员想要一种隔离托管代码的方法,而不会产生多个Windows进程的性能开销.如果CLR最初是在UNIX之上实现的(创建多个进程的成本要低得多),AppDomains可能永远不会被发明.
此外,虽然第三方应用程序中的托管插件架构绝对是AppDomains的良好用途,但它们存在的更大原因是SQL Server 2005和ASP.NET等知名主机.例如,ASP.NET托管提供商可以提供共享托管解决方案,该解决方案支持来自多个客户的多个站点,所有这些站点都在同一个Windows上运行.