【问题标题】:How to make Publisher Policy file redirect assembly request如何使发布者策略文件重定向程序集请求
【发布时间】:2010-09-16 03:47:42
【问题描述】:

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

我做错了什么?

澄清
由于开发人员无权访问测试服务器,因此我正在本地开发机器上对此进行测试。

【问题讨论】:

  • 您能否向我们提供发布商政策的 XML?
  • 如果这是在您的本地计算机上,您可以尝试使用 fusion logger,它实际上适用于所有版本的 .NET,您只需为任何版本的 .NET 安装 .NET SDK使用。
  • ...我知道..愚蠢的东西....您确定 publicKeyToken 和版本号正确吗?即新程序集的 AssemblyVersion 属性肯定是 1.1.0.0 并且公钥令牌相同(在 GAC 中)?
  • Max - 我明天开始的时间很早,现在是 01:40,希望你不介意我明天继续做这个吗?

标签: .net deployment gac


【解决方案1】:

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

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

【讨论】:

  • 不仅如此,assemblyIdentity 名称可以与 dll 文件名完全不同。
【解决方案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 中)?

您是否尝试过移除文化属性?

更新 3: 嗨 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 开关并明确指定版本号。

干杯
凯夫

【讨论】:

  • 我们没有 VS2008 在工作。我知道它没有获得新版本,因为我使用了这个:Response.Write(typeof(ApplicationSecurityContext).Assembly.FullName);不,它们都不在网络驱动器上。只是最新的。
  • 是的,完全一样。我还没有尝试删除文化属性。我应该从哪里删除它?参考文献?
  • 哦。这是有道理的,但我没有考虑。我确实使用了新的major.minor 而不是旧的名称。我会改变它,看看我能不能让它工作。
  • 还是什么都没有。快把我逼疯了……截图如下:picasaweb.google.com/schmeling88/Public#5255267654653332066
  • 我有点难过...您确定在新旧 DLL 的 AssemblyVersion 属性中正确设置了版本号,即 v1 中的 1.0.0.0 和 v2 中的 1.1.0.0 Leggett.Common.dll'?
猜你喜欢
  • 2017-09-09
  • 2010-10-08
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2020-06-02
  • 2017-03-29
  • 2010-12-19
  • 2020-08-15
相关资源
最近更新 更多