我在工作中创建了一个公共库,它安装在我们的测试服务器上的GAC中。我最近更新了它,我希望我们所有的应用程序都使用更新。我创建了一个发布者策略程序集并将其与更新一起安装在GAC中,但是当Web应用程序加载Leggett.Common 1.0.0.0时,它不会重定向到Leggett.Common,1.1.0.0。
我在网络驱动器上有公共程序集(实际上有五个,但是让它保持简单),我在其旁边创建了发布者策略xml文件,然后使用al.exe在中创建了发布者策略程序集。同一文件夹。之后,我将更新的程序集放在GAC中,然后将发布者策略程序集放在GAC中。
常见程序集是'Leggett.Common.dll',发布者策略文件是'1.1.Leggett.Common.policy',发布者策略程序集是'policy.1.1.Leggett.Common.dll'。
发布者策略文件的XML如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Leggett.Common"
publicKeyToken="32cd8f1a53a4c744"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="1.1.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
我做错了什么?
澄清
我正在我的本地开发机器上测试它,因为开发人员无法访问测试服务器。
答案 0 :(得分:2)
好的......在刺伤......
1 - 您是否尝试使用Assembly Binding Log Viewer (Fuslogvw.exe)查看正在进行的装配绑定?
您可以在以下网址找到它:
C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ FUSLOGVW.exe(已安装VS2008)。
2 - “我有一个共同的程序集(实际上有五个,但让它保持简单)在网络驱动器上,” - 两个程序集都驻留在网络驱动器上吗?
更新:确定...如果新程序集在网络驱动器上,则可能有一些trust issues。您是否可以将新程序集部署到服务器上的本地驱动器,然后重新安装到GAC?
Update2:我知道..愚蠢的东西......你肯定得到了publicKeyToken和版本号是否正确?即新程序集的AssemblyVersion属性肯定是1.1.0.0,公钥令牌是相同的(在GAC中)?
您是否尝试过删除文化?
Update3:您好Max ....您可以粘贴您使用的确切发布商政策文件吗?另外......请记住,如果要从1.0重定向到更高版本的程序集,则必须使用要重定向的程序集的major.minor版本命名发布者策略名称。因此,在您的情况下,发布者策略应命名为“policy.1.0.Leggett.Common.dll”。我注意到你已将它命名为'policy.1.1.Leggett.Common.dll',这可能是它无法正常工作的原因。
最后,您必须确保使用与1.0和1.1程序集使用的密钥相同的密钥签署发布者策略。
我构建了几个DLL并将它们放在GAC中,然后在VS中使用控制台应用程序进行测试,它确实有效:)
Update4:嗨Max,我从未想过的事情。创建发布者策略文件时,是否指定了平台?尝试使用以下方法构建它:
al /link:1.1.Leggett.Common.policy /out:policy.1.0.Leggett.Common.dll / keyfile:/ version:1.0.0.0
省略/ platform开关并明确指定版本号。
干杯
千电子伏
答案 1 :(得分:2)
您正确识别程序集,但对于正在阅读的其他人,请在 assemblyIdentity 元素中通过其根目录引用程序集,而不使用文件扩展名(例如,“Fubar”而不是“Fubar”。 DLL“)。
微软的documentation忽略了......#$%#!(!@!