如何:创建发布者策略
注意
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
程序集供应商可以通过在已升级的程序集中包含发布者策略文件,来指明应用程序应使用较新版本的程序集。 发布者策略文件指定程序集重定向和代码库设置,并使用与应用程序配置文件相同的格式。 发布者策略文件编译成程序集并放置在全局程序集缓存中。
创建发布者策略涉及三个步骤:
创建发布者策略文件。
创建发布者策略程序集。
将发布者策略程序集添加到全局程序集缓存中。
重定向程序集版本中介绍了发布者策略的架构。 以下示例演示了将一个 myAssembly
版本重定向到另一个版本的发布者策略文件。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Redirecting to version 2.0.0.0 of the assembly. -->
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
若要了解如何指定代码库,请参阅指定程序集的位置。
创建发布者策略程序集
使用程序集链接器 (Al.exe) 创建发布者策略程序集。
创建发布者策略程序集
在命令提示符处键入以下命令:
al /link:publisherPolicyFile /out:publisherPolicyAssemblyFile /keyfile:keyPairFile /platform:processorArchitecture
在此命令中:
publisherPolicyFile
参数是发布者策略文件的名称。publisherPolicyAssemblyFile
参数是此命令生成的发布者策略程序集的名称。 程序集文件名必须遵循以下格式:`policy.majorNumber.minorNumber.mainAssemblyName.dll'
keyPairFile
参数是包含密钥对的文件的名称。 必须使用同一密钥对来为程序集和发布者策略程序集签名。processorArchitecture
参数标识特定于处理器的程序集所面向的平台。备注
从 .NET Framework 2.0 开始,可将特定的处理器体系结构指定为目标。
从 .NET Framework 2.0 开始,可将特定的处理器体系结构指定为目标。 以下命令基于名为 pub.config
的发布者策略文件创建名为 policy.1.0.myAssembly
的发布者策略程序集,使用 sgKey.snk
文件中的密钥对为该程序集分配一个强名称,并指定该程序集的目标为 x86 处理器体系结构。
al /link:pub.config /out:policy.1.0.myAssembly.dll /keyfile:sgKey.snk /platform:x86
发布者策略程序集必须与其应用到的程序集的处理器体系结构相匹配。 因此,如果程序集的 ProcessorArchitecture 值为 MSIL,则必须使用 /platform:anycpu
创建该程序集的发布者策略程序集。 必须为每个特定于处理器的程序集提供单独的发布者策略程序集。
此规则的后果是,若要更改程序集的处理器体系结构,必须更改版本号的主要或次要号码部分,以便可以提供使用正确处理器体系结构的新发布者策略程序集。 一旦程序集使用不同的处理器体系结构,旧的发布者策略程序集就无法为该程序集提供服务。
另一种后果是,对于使用早期版本的 .NET Framework 编译的程序集,无法使用 2.0 版链接器创建发布者策略程序集,因为它始终指定处理器体系结构。
将发布者策略程序集添加到全局程序集缓存中
使用全局程序集缓存工具 (Gacutil.exe) 将发布者策略程序集添加到全局程序集缓存中。
将发布者策略程序集添加到全局程序集缓存中
在命令提示符处键入以下命令:
gacutil /i publisherPolicyAssemblyFile
以下命令将 policy.1.0.myAssembly.dll
添加到全局程序集缓存中。
gacutil /i policy.1.0.myAssembly.dll
重要
除非在 /link
参数中指定的原始发布者策略文件与程序集位于同一目录中,否则无法将发布者策略程序集添加到全局程序集缓存中。