什么是AppDomain?

什么是AppDomain?

  操作系统和运行时环境都提供了一些用于隔离应用程序机制。举个例子,Windows操作系统利用进程来隔离应用程序(在同一个计算机上,以往都是由“进程边界”来隔离应用程序的运行:不能在两个进程间直接调用,若要调用,则必须以间接的方式,比如使用代理)。

  AppDomain在很多方面(比如:安全、可靠性、版本控制以及卸载程序集dll)也提供了隔离边界。

  首先,AppDomain常是由“运行时宿主”(runtime hosts,一般“在应用程序运行前”引导CLR)创建。

  其次,托管代码在运行前必须经过一个验证流程(除非管理者授权许可可以跳过验证)。

  这个验证流程判断托管代码是否企图访问违法的内存地址或者是否执行一些能够使“其所在的进程失败时”却正常运转的行为(The verification process determines whether the code can attempt to access invalid memory addresses or perform some other action that could cause the process in which it is running to fail to operate properly.)。 托管代码通过验证,意味着其是类型安全的。验证托管代码的类型安全,让CLR在一个很低的性能成本下具有 “与进程边界相同级别”的隔离应用程序的能力。

  AppDomain提供了一种更安全的通用处理机制,CLR用它隔离应用程序。在同一个进程中运行多个AppDomain,可使AppDomain间的隔离级别与“独立进程间的隔离级别”一样,却不引起额外的开销(进程间的调用和进程间的切换)。这提升了服务器可扩展性。

  使用AppDomain的好处有:

  (1)应用程序内的错误,不会影响到其他应用程序。这是因为类型安全的代码不会引起内存错误。使用AppDomain保证了在进程内代码运行不会影响到其他应用程序。

  (2)可以单独停止某个应用程序,而不用停止整个进程。注:不能卸载某个程序集或者类型,只能卸载一个完整的AppDomain。

  (3)应用程序不能直接访问另一个AppDomain中的代码或者资源。

  CLR强制阻止了不同AppDomain应用程序间的直接调用。不同AppDomain对象的访问,是通过其副本(copy)或者代理(proxy)。若通过副本,其调用则是本地的(local),即调用者和被调用的对象都是在同一个AppDomain内的引用。若通过代理,其调用则是远程的(remote),即调用者和被调用的对象是在不同的AppDomain内的引用。这种跨域的调用,所采用的远程调用架构(remote call infrastructure),与两个进程间或者两个机器间的远程调用架构一致。同样的,为了让“方法调用”能够进行正确地JIT编译,被跨域引用的对象的元数据应该要是可获取的(对两个AppDomain来说)。如果不能访问元数据,则导致编译时错误。

  (4)应用程序域提供了配置设置,如应用程序版本策略,任何所访问的远程程序集的位置和信息。

  (5)可以通过托管代码所在的AppDomain来控制托管代码的许可权限。

posted @ 2021-06-26 05:25  误会馋  阅读(875)  评论(0编辑  收藏  举报