开发人员经常需要运行外部的程序集.然而运行外部程序集很容易导致低效的资源利用以及降低系统 安全性.规避这类风险最好的方法就是创建应用程序域,在受保护的环境下调用程序集.
一. 概述 程序集是一个逻辑容器,允许在一个进程中运行多个程序集并提供有效的隔离
应用程序域具有以下的优点:
在一个应用程序中出现的错误不会影响其他应用程序.因为类型安全的代码不会导致内存错误,所 以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序. 能够在不停止整个进程的情况下停止单个应用程序.使用应用程序域使您可以卸载在单个应用程序 中运行的代码. 注意 不能卸载单个程序集或类型.只能卸载整个域.
在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源.为了强制实施此隔离, 公共语言运行库禁止在不同应用程序域中的对象之间进行直接调用.要在各域之间传递对象,可以复 制这些对象,或通过代理访问这些对象.如果复制对象,那么对该对象的调用为本地调用.也就是说, 调用方和被引用的对象位于同一应用程序域中.如果通过代理访问对象,那么对该对象的调用为远程 调用.在此情况下,调用方和被引用的对象位于不同的应用程序域中.域间调用所采用的远程调用基 础结构与两个进程间的调用或两台计算机间的调用的基础结构相同.因此,被引用的对象的元数据必 须对于两个应用程序域均可用,以便用 JIT 正确编译该方法调用.如果调用域对被调用对象的元数 据没有访问权,则编译可能失败,并引发类型为 System.IO.FileNotFound 的异常.
代码行为的作用范围由它所在的应用程序决定.换言之,应用程序域将提供应用程序版本策略等配 置设置,它所访问的任意远程程序集的位置,以及加载到该域中的程序集的位置信息. 向代码授予的权限可以由代码运行所在的应用程序域来控制. |