关于.net:使用AppDomain的好例子

关于.net:使用AppDomain的好例子

Good example of use of AppDomain

在访谈中,我不断被问到有关AppDomain的问题,我知道一些基本知识:

  • 它们是应用程序中的隔离级别(使它们与应用程序不同)
  • 他们可以有线程(使它们不同于线程)
  • 一个应用程序域中的异常不会影响另一个
  • 应用程序域无法访问彼此的内存
  • 每个应用程序域可以具有不同的安全性

我仍然不明白什么使他们必要。我正在寻找一个合理的具体环境,以供您使用。

答案:

  • 不受信任的代码
    • 核心应用程序受保护
      通过在具有安全限制的单独appdomain中进行隔离,禁止不受信任的/第三方插件破坏共享内存和未经授权的访问注册表或硬盘驱动器,从而保护应用程序或服务器。例如ASP.NET和SQL Server托管组件代码
  • 受信任的代码
    • 稳定性
      将应用程序细分为安全,独立的功能
    • 架构灵活性
      可以在单个CLR实例或每个程序中单独运行多个应用程序。

还要别的吗?


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

另外,不可能卸载特定的程序集,但是您可以卸载AppDomains。

对于完整的摘要,克里斯·布鲁姆(Chris Brumme)对此有大量博客条目:

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

https://devblogs.microsoft.com/cbrumme/appdomains-application-domains/


AppDomains的另一个好处(如您在问题中所提到的)是您加载到其中的代码可以在不同的安全权限下运行。例如,我编写了一个动态加载DLL的应用程序。我是一名讲师,这些是我正在加载的学生DLL。我不想让一些心怀不满的学生消磨我的硬盘驱动器或破坏我的注册表,所以我将代码从其DLL加载到了一个单独的AppDomain中,该AppDomain没有文件IO权限,注册表编辑权限甚至不具有显示新窗口的权限。 (它实际上仅具有执行权限)。


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

同样,虽然第三方应用程序中的托管插件体系结构无疑是AppDomain的很好用法,但它们存在的更大原因是使用知名主机,例如SQL Server 2005和ASP.NET。例如,ASP.NET托管提供程序可以提供共享的托管解决方案,该解决方案支持来自多个客户的多个站点,这些站点都在单个Windows进程下运行的同一机器上。


据我了解,AppDomain旨在允许托管实体(操作系统,数据库,服务器等)自由地在单个CLR实例或每个程序中运行多个应用程序。因此,这对于主机而不是应用程序开发人员来说是一个问题。

与Java相比,Java在Java中每个应用程序始终拥有1个JVM,这常常导致JVM的许多实例与重复的资源并排运行。


应用程序域非常适合应用程序稳定性。

通过让您的应用程序包含一个中央进程,然后在单独的应用程序域中生成"功能",可以防止全局崩溃(如果其中一个行为异常)。


如果创建允许第三方插件的应用程序,则可以将这些插件加载到单独的AppDomain中,以使主应用程序免受未知代码的侵害。

ASP.NET还在单个工作进程中为每个Web应用程序使用单独的AppDomain。


我看到用于创建单独的应用程序域的2个或3个主要用例:

1)类似于进程的隔离,具有较低的资源使用率和开销。例如,这就是ASP.NET所做的-它在单独的应用程序域中托管每个网站。如果它在单个应用程序域中使用了不同的线程,则不同网站的代码可能会相互干扰。如果它在不同的过程中托管不同的网站-将使用大量资源,并且与进程内通信相比,进程间通信相对困难。

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

3)能够卸载程序集以减少不必要的内存使用。不幸的是,无法从应用程序域中卸载程序集。因此,如果将某个大型程序集加载到主应用程序域,则不再需要在该程序集之后释放相应内存的唯一方法是关闭应用程序。解决此问题的方法是在一个单独的应用程序域中加载程序集并在不再需要这些程序集时卸载该应用程序域。


推荐阅读

    未知软件异常应用程序错误解决方案

    未知软件异常应用程序错误解决方案,,我有很多朋友的电脑未知软件异常应用程序错误的问题,对于异常未知的软件异常中的应用一般提示(0xc00000

    电脑主板品牌的一些基本知识

    电脑主板品牌的一些基本知识,,组装的电脑不再是什么奇怪的事情,不再是一个专业的专利,许多普通的电脑用户可以自己组装电脑,但是,毕竟用户电脑

    设置线程名称|tomcat线程名称设置

    设置线程名称|tomcat线程名称设置,,1. tomcat线程名称设置一.tomcat的优化1.tomcat的自身调优采用动静分离调优Tomcat线程池调优Tomcat的

    小米手机安装的应用程序包在哪里

    小米手机安装的应用程序包在哪里,,问题: 下载小米手机系统的安装文件在哪里 答案uff1a 下载应用程序包位置:SD卡>下载。 (摘自:小米手册:米

    多线程cpu电脑|多线程的CPU

    多线程cpu电脑|多线程的CPU,,1. 多线程的CPU四核心四线程,表示这个电脑的CPU核心是4个核心、4个线程的。电脑CPU的核心数量和线程数量越多,

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    基本知识:组装计算机的基本步骤

    基本知识:组装计算机的基本步骤,,如何组装一台性价比高、稳定性好的计算机通常需要以下8个步骤。 1。收集市场信息并制定安装计划 随着计