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


推荐阅读

    linux查询线程命令?

    linux查询线程命令?,系统,第一,线程,命令,进程,代码,分时,软件,选项,界面,如

    linux线程查询命令?

    linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Lin

    linux线程查询命令?

    linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Lin

    linux多线程下载命令?

    linux多线程下载命令?,软件,工具,平台,中心,系统,代理,网络,网站,手机,官方

    linux断开线程命令?

    linux断开线程命令?,系统,状态,工作,代码,线程,入口,网络,管理,名称,命令,lin

    linux停止线程的命令?

    linux停止线程的命令?,系统,软件,代码,产品,进程,第一,管理,生产,通信,工具,l

    linux超线程查看命令?

    linux超线程查看命令?,系统,第一,信息,软件,命令,数据,工具,实时,界面,个数,L

    linux查看多线程命令?

    linux查看多线程命令?,系统,第一,线程,地址,数据,进程,命令,名称,软件,情况,

    linux执行线程命令?

    linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,lin

    linux线程操作命令?

    linux线程操作命令?,系统,工作,时间,代码,线程,信息,第一,命令,函数,操作,lin

    linux下载命令多线程?

    linux下载命令多线程?,系统,单位,概念,数据,线程,进程,产品,地址,代码,状态,

    linux线程相关命令行?

    linux线程相关命令行?,系统,实时,代码,进程,线程,命令,策略,分时,时间,名称,

    linux删掉线程的命令?

    linux删掉线程的命令?,状态,线程,进程,代码,地址,时间,系统,环境,管理,传播,l

    linux命令和应用程序?

    linux命令和应用程序?,软件,系统,环境,管理,基础,情况,位置,电脑,工具,中心,

    linux多线程跑命令?

    linux多线程跑命令?,系统,代码,单位,地址,工具,入口,信息,管理,位置,服务,Lin

    linux线程挂起命令?

    linux线程挂起命令?,系统,状态,信息,概念,管理,基础,时间,暂停,设计,数据,lin

    linux下查看线程命令?

    linux下查看线程命令?,系统,线程,第一,进程,底部,环境,命令,选项,手册,存在,l

    Python3多线程爬虫讲解

    Python3多线程爬虫讲解,代码,分时,系统,网络,状态,培训,做多,时间,线程,爬

    Python的进程和线程

    Python的进程和线程,管理,数据,软件,系统,单位,进程,线程,发展,概念,地址,进