2009年07月02日

来源:互联网 发布:editplus软件汉化包 编辑:程序博客网 时间:2024/06/02 23:27
配置发布者策略

这里快速回顾一下。目前可以使用应用程序配置文件在应用程序级进行版本绑定配置,也可使用机器配置文件在机器级进行版本绑定配置。如果您是一个组件供应商,正在发布的程序集存在明显的或潜在的错误,是否其愿意指导焦急的用户来编辑这些配置文件?如果用户在GAC中安装了新的(希望没有bug)程序集,而且所有引用该程序集的应用程序自动绑定到新的版本上,这样做不是更明智吗?回答是肯定的。这里就涉及到.NET对发布者策略的支持。

发布者策略允许程序集供应商将应用程序重定向到程序集的新版本上。发布者策略随着新的程序集一起发布,并安装在GAC中。应用程序配置文件和机器配置文件是简单文本文件,而发布者策略文件实际上是程序集本身。

1. 构建发布者策略程序集

对运行库来说,要将一个程序集确认为发布者策略,必须按照以下约定来命名:

policy.<major>.<minor>.<assemblyname>

这里<major>是主版本号,<minor>是次版本号,<assemblyname>是使用策略的程序集名。例如,MathLibrary程序集的发布者策略文件命名为policy.1.0.MathLibrary.dll

但是直到写本书为止,Visual Studio IDE还没有为构建发布者策略程序集提供项目模板。不过可以使用程序集链接器(Assembly Linker)al.exe命令来实现这一目的。首先创建一个带有相应版本重定向的XML文件。这个XML文件的格式与应用配置文件完全相同。下例举例说明如何将对MathLibrary 1.0.1.1的请求重定向到1.0.1.2版本。

<configuration>

<runtime>

<assemblyBindingxmlns="urn:schemas-microsoft-com:asm.v1">

<dependentAssembly>

<assemblyIdentityname="MathLibrary"

publicKeyToken="99cb5ad97d1088c5"/>

<bindingRedirectoldVersion="1.0.1.1"

newVersion="1.0.1.2"/>

</dependentAssembly>

</assemblyBinding>

</runtime>

</configuration>

假设这个XML存放在名为PublisherPolicy.xml的文件中,可以使用下面程序集链接器命令将其打包进程序集中:

al /link:publisherpolicy.xml/out:policy.1.0.MathLbrary.dll/keyf:d:\mykey.snk/v:1.0.0.0.

该命令将XML文件编译进名为policy.1.0.MathLibrary.dll的程序集中,同时使用以前创建的公共/私有密钥文件为程序集分配一个强名称。最后把发布者策略程序集的版本号设为1.0.0.0。需要注意,这个版本号不会对有重定向要求的MathLibrary起什么作用,只适用于发布者策略程序集。

一旦建立发布者策略程序集,只需将其安装在GAC中即可(见图2-19)。发布者策略文件一就位,对于1.0.1.1版本的MathLibrary的所有请求都会重定向到1.0.1.2版本的MathLibrary。实际上,根据命名规范,运行库为任何1.0.*版本请求读取该策略文件。这里可以得出结论:发布者策略文件只能用于针对主版本号和次版本号的重定向请求。

虽然Visual Studio .NET没有发布者策略项目模板,但是可以使用类库项目建立一个策略文件。操作时,只需删掉生成的默认类,并向项目中添加PublisherPolicy.xml文件即可,并在AssemblyInfo.cs文件中用AssemblyKeyFileAssemblyVersion特性设置密钥文件和版本号。

2009年07月02日

2-19  查看 GAC中的MathLibrary发布者策略文件

2. 强制关闭发布者策略

在发布一个带有新程序集版本的发布者绑定策略之前,应充分考虑新版本的后向兼容能力。特别地,这就意味着应当保持现有公共接口,对实现的改变不要有损客户应用程序的性能。在增加诸如新类型、方法和属性等程序集项目或修复漏洞时,要避免引起新程序集的不兼容。

如果将应用程序错误地重定向到不兼容的程序集上,客户端有两种选择解决这一问题。其一,在应用程序配置文件中设置正确的重定向版本号;其比发布者策略有更高优先级,后者被忽略。其二,向应用程序配置文件中添加用来关闭发布者策略的<publisherPolicy>元素,这种解决方案成为安全模式(safe mode)

根据<publisherPolicy>元素在应用程序配置文件中放置的位置,来决定是对整个应用程序有效,还是对特定的程序集请求有效。如果它是<assemblyBinding>元素的子元素,那么对整个应用程序有效。

<configuration>

<runtime>

<assemblyBindingxmlns="urn:schemas-microsoft-com:asm.v1">

<publisherPolicyapply="no" />

</assemblyBinding>

</runtime>

</configuration>

但是,如果是<dependentAssembly>元素的子元素,那么它仅仅应用于特定的程序集。

<configuration>

<runtime>

<assemblyBindingxmlns="urn:schemas-microsoft-com:asm.v1">

<dependentAssembly>

<assemblyIdentityname="MathLibrary"

publicKeyToken="99cb5ad97d1088c5"/>

<publisherPolicyapply="no"/>

</dependentAssembly>

</assemblyBinding>

</runtime>

</configuration>

使用<codeBase>元素

前面介绍过,程序集存放在两个地方:一个是在GAC或应用程序目录下的直接或间接子目录中;另一个位置可能在计算机、网络或Web站点中的某处,运行库将对其进行查找。当然,这需要指定程序集的确切位置。可以使用<codeBase>元素来实现,举例如下:

<configuration>

<runtime>

<assemblyBindingxmlns="urn:schemas-microsoft-com:asm.v1">

<probingprivatePath="libs" />

<dependentAssembly>

<assemblyIdentityname="MathLibrary"

publicKeyToken="99cb5ad97d1088c5"/>

<bindingRedirectoldVersion="1.0.550.39732"

newVersion="1.0.550.41003"/>

<codeBaseversion="1.0.550.41003"

href="file://d:/MathLibrary.dll"/>

</dependentAssembly>

</assemblyBinding>

</runtime>

</configuration>

类似于<bindingRedirect>元素,<codeBase>也是<dependentAssembly>的子元素。通过设置href特性告知运行库按照给定的URL来查找程序集,设置version特性表示路由到该URL的请求版本。注意,运行库在版本绑定重定向后会一直检查<codeBase>元素的值。即使用户请求1.0.550.39732版本,<bindingRedirect>元素也会将这个版本请求重定向到1.0.550.41003。现在这个版本请求与<codeBase>元素中的值匹配,运行库就从指定的URL提取程序集。

在这个例子中,URL指向文件系统中的一个位置。当然也能指定一个Web站点:

<codeBaseversion="1.0.552.41586"

href="http://www.mywebsite.com/MyAssemblies/MathLibrary.dll"/>

如前面例子所示,<codeBase>元素指向强名称程序集,当然也可以用它来查询常规程序集。但是,如果常规程序集位于应用程序目录的直接或间接子目录中,运行库将只允许一个常规程序集绑定。因此,从Web站点下载的常规程序集不能被绑定。另外,对于常规程序集,运行库忽略version特性,也就不必设置<codeBase>version特性。下面配置示例显示了如何使用<codeBase>元素查找常规程序集。

<configuration>

<runtime>

<assemblyBindingxmlns="urn:schemas-microsoft-com:asm.v1">

<dependentAssembly>

<assemblyIdentity name="MathLibrary"/>

<codeBase

href="file://D:\MathClient\bin\Debug\libs\MathLibrary.dll"/>

</dependentAssembly>

</assemblyBinding>

</runtime>

</configuration>

原创粉丝点击