注释
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
遵循以下常规准则,创建专为并行执行设计的托管应用程序或组件:
将类型标识绑定到文件的特定版本。
通过使用具有强名称的程序集,公共语言运行时将类型标识绑定到文件的特定版本。 若要为并行执行创建应用程序或组件,必须为所有程序集提供强名称。 这将创建精确的类型标识,并确保任何类型解析都定向到正确的文件。 具有强名称的程序集包含版本、区域性和发行者信息,运行时使用这些信息来正确地定位文件,从而满足绑定请求。
使用具有版本管理功能的存储。
运行时使用全局程序集缓存来提供版本感知存储。 全局程序集缓存是安装在使用 .NET Framework 的每台计算机上安装的版本感知目录结构。 安装在全局程序集缓存中的程序集不会在安装该程序集的新版本时被覆盖。
创建隔离运行的应用程序或组件。
隔离运行的应用程序或组件必须管理资源,以避免当应用程序或组件的两个实例同时运行时发生冲突。 应用程序或组件还必须使用特定于版本的文件结构。
应用程序和组件隔离
成功设计应用程序或组件进行并行执行的一个关键是隔离。 应用程序或组件必须以隔离的方式管理所有资源,尤其是文件 I/O。 遵循以下准则,确保应用程序或组件以隔离方式运行:
按照版本特定的方式,写入注册表。 将指示版本的值存储在配置单元或项中,同时,不要在组件的不同版本间共享信息或状态。 这可以防止同时运行的两个应用程序或组件覆盖信息。
使命名的内核对象成为版本特定的内核对象,以避免发生争用条件。 例如,当来自同一应用程序的两个版本的两个信号灯互相等待时,就发生了争用条件。
使文件和目录名称支持版本管理。 这意味着文件结构应依赖于版本信息。
以特定于版本的方式创建用户帐户和组。 应用程序创建的用户帐户和组应由版本标识。 不要在应用程序版本之间共享用户帐户和组。
安装或卸载版本
在为并行执行设计应用程序时,请遵循以下有关安装和卸载版本的准则:
不要从注册表中删除在其他版本的 .NET Framework 下运行的应用程序可能需要的信息。
请勿替换注册表中可能由其他应用程序在不同版本的 .NET Framework 下运行时需要的信息。
不要注销在其他版本的 .NET Framework 下运行的其他应用程序可能需要的 COM 组件。
请勿更改已注册的 COM 服务器的 InprocServer32 或其他注册表项。
请勿删除其他在 .NET Framework 版本下运行的其他应用程序可能需要的用户帐户或组。
不要将任何内容添加到包含未反转路径的注册表。
文件版本号和程序集版本号
文件版本是运行时不使用的 Win32 版本资源。 通常情况下,即使是对于就地更新,也应更新文件版本。 两个相同的文件可以具有不同的文件版本信息,两个不同的文件可以具有相同的文件版本信息。
运行时使用程序集版本进行程序集绑定。 运行时将具有不同版本号的两个相同程序集视为两个不同的程序集。
全局程序集缓存工具(Gacutil.exe)允许仅当文件版本号较新时替换程序集。 安装程序在安装时通常不会覆盖程序集,除非该程序集版本号较大。