.net - 如何使发布者策略文件重定向程序集请求

标签 .net deployment gac

我在工作中创建了一个公共(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/

相关文章:

Azure 应用服务 (Linux) 上的 .NET 6.0 应用程序找不到连接字符串

c# - 使用数据库使用 asp.net 构建菜单

ruby-on-rails - 将 rails 部署到 heroku - 未经授权的公钥访问

c# - 流行的开源库和引用冲突

c# - 如何通过 PublicKeyToken 从 GAC 中批量卸载程序集?

c# - 记录来自 Windows 服务的异常

asp.net - 是否可以使用 Visual Studio Web 发布到 Azure Web App 来部署单个 aspx.cs 文件(Azure 运行时问题)

.net - 何时需要使用 GAC 共享程序集?

.Net Assembly/dll 共享和部署

c# - 如何在 Powershell 中嵌套自定义 .NET 类型?