创建和配置应用程序域

当宿主根据上一节中所述的条件确定了域边界所在的位置后,它将使用 System.AppDomain 类型的 CreateDomain 方法来创建要在其中运行用户代码的域。 每个应用程序域都包含一个名称/值对的集合,宿主可以将有关域的信息存储在这些名称/值对中。 然后,名称/值对将作为参数传递给 CreateDomain

.NET Framework 定义了大量运行时本身即可理解的属性。 这些属性的名称由类 System.AppDomain 中的静态字符串定义。 宿主可以设置本身即可理解的属性以自定义应用程序域。 例如,这些属性可以控制如何隔离在不同域中运行的代码。 为了使宿主能够定义用于存储方案特定信息的自定义属性,可以对名称/值对进行扩展。

总的说来,应用程序域提供的隔离具有两种形式:

  • 应用程序域防止一个域中的类型发现和调用其他域中的类型,从而防止在一个应用程序域中运行的代码影响其他域。 应用程序域将依赖于这样的事实:代码已经过验证,不会受到内存故障的损害。

  • 宿主控制运行时从何处查找代码,以代表宿主将代码加载到特定的应用程序域中。 这一点很重要,因为它将防止一个应用程序中的代码意外地影响其他应用程序。 以这种方式控制代码加载请求范围的能力与 Microsoft Win32 和 COM 当前的工作方式有很大的区别。 当前,在 Windows 中,由于任何应用程序都可以使用注册表中所述的任何代码或位于已知位置(如 Windows system 目录)中的任何代码,所以解析范围是整个计算机。 以这种方式进行共享是当前的默认方式,而这种行为可能会导致 DLL 冲突。

除了确立代码加载方式的范围外,还必须将配置信息的范围缩小到一个应用程序。 不过,对于多数配置设置,目前尚不太可能。

例如,如果配置一个远程计算机来运行 COM 类,那么特定类在注册表中的 RemoteServerName 键设置将影响所有使用该类的应用程序。 与非有意的代码共享类似,非有意共享地配置数据将防止应用程序完全控制其自身的行为。

AppDomainSetup.ApplicationBaseAppDomainSetup.ConfigurationFile 属性分别控制以下两方面的能力:指定运行时查找程序集的目录;控制特定应用程序域的配置设置范围。

ApplicationBase 将为应用程序域建立一个根目录,运行时会在该目录下查找专用程序集。 如果宿主允许从磁盘加载程序集,它必须提供一个 ApplicationBase,让运行时知道从何处查找已加载的程序集。

ConfigurationFile 属性指定包含配置应用程序(这些应用程序在应用程序域中运行)时所用设置的 XML 文件的名称。 应用程序配置文件中的设置示例包括程序集版本控制规则,以及有关如何查找应用程序域中运行的类型可远程访问类型的指南。

有关可用来配置应用程序域的其他属性的说明,请参见 AppDomain 类的文档。

安全说明 AppDomainSetup.DisallowCodeDownload 属性的默认值为 false。 此设置对于服务是不安全的。 为了避免服务下载部分受信任的代码,请将此属性设置为 true

请参见

参考

AppDomain

其他资源

承载(非托管 API 参考)