如何使Publisher策略文件重定向程序集请求

时间:2008-10-08 22:36:36

标签: .net deployment gac

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

我做错了什么?

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

2 个答案:

答案 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忽略了......#$%#!(!@!