我在工作中创建了一个公共(public)库,并将其安装在我们测试服务器上的 GAC 中。我最近更新了它,我希望我们所有的应用程序都使用该更新。我创建了一个发布商策略程序集并将其与更新一起安装在 GAC 中,但是当 Web 应用程序加载 Leggett.Common, 1.0.0.0 时,它不会重定向到 Leggett.Common, 1.1.0.0。
我在网络驱动器上有通用程序集(实际上有五个,但让我们保持简单),我在它旁边创建了发布者策略 xml 文件,然后使用 al.exe 在同一个文件夹。之后,我将更新后的程序集放入 GAC 中,然后将发布商策略程序集放入 GAC 中。
公共(public)程序集是“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>
我做错了什么?
澄清
我正在本地开发计算机上对此进行测试,因为开发人员无权访问测试服务器。
最佳答案
好吧...马上...
1 - 您是否尝试过使用 Assembly Binding Log Viewer (Fuslogvw.exe)查看正在发生什么程序集绑定(bind)?
您可以在以下位置找到它:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\FUSLOGVW.exe(已安装 VS2008)。
2 - “我在网络驱动器上有通用程序集(实际上有五个,但让其保持简单)” - 两个程序集都驻留在网络驱动器上吗?
更新: 好的...如果新程序集位于网络驱动器上,则可能有一些 trust issues 。您可以将新程序集部署到服务器上的本地驱动器,然后重新安装到 GAC 吗?
更新2:我知道..愚蠢的东西....你的publicKeyToken和版本号肯定是正确的吗?即,新程序集的 AssemblyVersion 属性肯定是 1.1.0.0 并且公钥标记是相同的(在 GAC 中)?
您是否尝试过删除文化属性?
更新3:嗨,Max...您可以粘贴您使用的确切发布商策略文件吗?另外...请记住,如果您从 1.0 重定向到更高版本的程序集,则发布者策略名称必须使用您重定向的程序集的 Major.minor 版本来命名。因此,在您的情况下,发布者策略应命名为“policy.1.0.Leggett.Common.dll”。我注意到您已将其命名为“policy.1.1.Leggett.Common.dll”,这可能是它不起作用的原因。
最后,您必须确保使用 1.0 和 1.1 程序集使用的相同 key 签署发布者策略。
我构建了几个 DLL 并将它们放入 GAC 中,然后使用 VS 中的控制台应用程序进行测试,它确实有效:)
更新4:嗨,Max,这是我从未想过的事情。当您创建发布者策略文件时,您是否指定了平台?尝试使用以下命令构建它:
al/link:1.1.Leggett.Common.policy/out:policy.1.0.Leggett.Common.dll/keyfile:/version:1.0.0.0
省略/platform 开关并明确指定版本号。
干杯
凯夫
关于.net - 如何使发布者策略文件重定向程序集请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/185187/