2008-09-18 64 views
44

的好例子,我一直在采访在问有关的AppDomain,并I know the basics使用的AppDomain

  • 他们的应用程序中的隔离级别(使他们的应用程序不同)
  • 他们可以有螺纹(使他们线程不同)
  • 例外在一个AppDomain中不影响其他
  • 的AppDomain不能访问彼此的记忆
  • 每个应用程序域可以有不同的安全

我仍然没有得到什么使他们有必要。我正在寻找一个合理的具体情况,当你使用一个。

答案:

  • 不可信代码
    • 核心应用程序保护
      不可信/第三方插件从腐败共享内存和非授权禁止访问注册表或单独的应用程序域通过隔离硬盘驱动器有安全限制,保护应用程序或服务器。例如ASP.NET和SQL服务器托管组件代码
  • 可信代码
    • 稳定性
      应用分成安全,独立的特性/功能
    • 架构的灵活性
      自由跑单CLR实例中的多个应用程序或者各自的程序。

还有什么?

回答

49

可能最常见的一种是加载包含来自不受信任方的插件代码的程序集。代码在自己的AppDomain中运行,隔离应用程序。

另外,无法卸载特定程序集,但可以卸载AppDomains。

对于全破败,克里斯Brumme对这个庞大的博客条目:

http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

+0

+1链接到克里斯Brumme的博客文章。必读。 – dotnetguy 2012-12-10 08:47:29

4

如果您创建一个应用程序,它允许第三方插件,您可以在加载这些插件一个独立的AppDomain,这样你的主应用程序就可以安全的从未知的代码。

对于单个工作进程中的每个Web应用程序,ASP.NET也使用单独的AppDomains。

4

应用程序域对于应用程序的稳定性非常好。

通过让您的应用程序包含一个中央进程,然后在单独的应用程序域中生成“功能”,您可以防止全局崩溃,如果其中一个失败。

3

据我了解的AppDomain的设计,让主机实体(操作系统,数据库,服务器等)的自由跑单CLR实例或在自己的每个项目中的多个应用程序。所以它是主机而不是应用程序开发人员的问题。

这与Java相媲美,你总是有每个应用程序1个JVM,往往导致运行在JVM中并肩复制资源的多个实例。

7

我认为有AppDomain的主要动机是CLR的设计者希望隔离管理的代码不会产生多个Windows进程的性能开销的方法。如果CLR最初是在UNIX之上实现的(创建多个进程的成本显着降低),AppDomains可能永远不会被发明。

此外,而在第三方应用程序管理插件架构绝对是一个很好用的AppDomain中,它们存在的更大的原因是众所周知的主机,如SQL Server 2005和ASP.NET。例如,ASP.NET托管服务提供商可以提供共享托管解决方案,该解决方案支持来自多个客户的多个站点,这些站点都位于单个Windows进程下运行的相同框上。

14

AppDomain的另一个好处(就像你在你的问题中提到的那样)是你加载到它的代码可以运行不同的安全权限。例如,我编写了一个动态加载DLL的应用程序。我是一名教练,这些是我加载的学生DLL。我不想让一些心怀不满的学生消灭我的硬盘驱动器或损坏我的注册表,所以我将代码从它们的DLL加载到单独的AppDomain中,该AppDomain没有文件IO权限或注册表编辑权限,甚至无法显示新窗口(它实际上只有执行权限)。

3

我看到2或3用于创建单独的应用程序的域主用例:具有低的资源使用和开销

1)过程状隔离。例如,这就是ASP.NET所做的 - 它将每个网站托管在单独的应用程序域中。如果它在单个应用程序域中使用不同的线程,那么不同网站的代码可能会相互干扰。如果它在不同的进程中托管不同的网站 - 与进程间通信相比,它将使用大量资源并且进程间通信相对困难。

2)在具有特定安全权限的单独应用程序域中执行不可信代码(实际上与第一个原因有关)。正如人们已经说过的,您可以将第三方插件或不受信任的dll加载到单独的应用程序域中。

3)能力卸载组件,以减少不必要的内存使用情况。不幸的是,无法从应用程序域卸载程序集。因此,如果您将一些大型程序集加载到主应用程序域,那么在该程序集之后释放相应内存的唯一方法就是不再需要关闭应用程序。在不需要这些程序集的情况下,将程序集加载到单独的应用程序域中并卸载该应用程序域即可解决此问题。