确定应用程序域边界
当承载代码完成从非托管代码到托管代码的转换后,它必须新建一个或多个用于运行用户代码的应用程序域。 应用程序域是宿主隔离在进程中运行的代码时所使用的构造。 为了确保不应交互的代码无法进行交互,这种隔离是必要的。 例如,如果代码从两个不同的网站下载到 Internet Explorer 宿主中,则必须将其隔离。 为了确保这种隔离,Internet Explorer 宿主将为每个站点创建一个应用程序域。
宿主在创建用于运行用户代码的应用程序域之前,必须确定新应用程序域的边界位置。 影响这一决定的因素包括:如何限制特定类型对其他类型的访问权限,配置方面的要求,安全性方面的要求以及能否卸载不需要的代码。
限制对类型的访问
在一个应用程序域中运行的类型能够发现在该域中运行的其他类型并直接调用这些类型。 但是,一个类型永远也无法发现在其他应用程序域中运行的类型,因此也无法调用这些类型。 当确定在何处创建边界时,能否限制特定类型对其他类型的访问是需要考虑的主要事项。
配置设置
应用程序域是运行时中配置的基本单位。 每个应用程序域都有一个可选的关联配置文件,该文件描述与该域中所运行代码相关的设置。
例如,配置文件中可以包含用于查找专用程序集的目录列表,共享程序集的版本绑定信息,以及可远程访问的类型的位置等。
安全性
宿主可以为域设置代码访问安全策略和基于角色的安全策略。 这样,宿主既能够控制向特定域中的代码授予的权限集,也能为基于角色的安全策略设置当前线程的主体和默认的主体。
例如,宿主可以定义应用程序域级别的代码访问安全策略,以确保在该域中只能运行从特定站点下载的代码。 或者,宿主可以设置基于角色的安全主体,以实现自定义的身份验证方案。
代码卸载
要从内存中卸载在进程中运行的托管代码,以便将内存用于其他目的,宿主必须卸载代码运行时所在的应用程序域。 不能卸载单独的程序集或类型。 在何时可以卸载用户代码这一方面,宿主有其自己的规则。 例如,Internet 浏览器可能会将托管控件加载到由站点确定的域中。 此时,浏览器可能会应用相应的规则,在内存中保留最近查看过的网页,以便使“前进”和“后退”按钮更迅速地作出响应。 当浏览器确定不再需要在内存中保留某页时,它将删除应用程序域,因此也删除了托管控件的代码。