2

我在工作中创建了一个通用库,它安装在我们测试服务器上的 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>

我究竟做错了什么?

澄清
我正在我的本地开发机器上测试这个,因为开发人员无权访问测试服务器。

4

2 回答 2

2

好吧……在刺中……

1 - 您是否尝试过使用程序集绑定日志查看器 (Fuslogvw.exe)查看正在发生的程序集绑定?

您可以在以下位置找到它:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\FUSLOGVW.exe(安装了VS2008)。

2 - “我有一个网络驱动器上的通用程序集(实际上有五个,但让我们保持简单),” - 两个程序集都驻留在网络驱动器上吗?

更新:好的...如果新程序集位于网络驱动器上,则可能存在一些信任问题。您能否将新程序集部署到服务器上的本地驱动器,然后重新安装到 GAC?

更新2 :我知道..愚蠢的东西....您肯定得到了正确的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 开关并明确指定版本号。

干杯
凯夫

于 2008-10-08T22:57:10.247 回答
2

您正确识别了程序集,但对于正在阅读的任何其他人,请在没有文件扩展名的assemblyIdentity元素中按其根目录引用程序集(例如,“Fubar”而不是“Fubar.dll”)。

微软的文档忽略了... #$%#!(!@!

于 2008-11-20T22:52:54.993 回答