【问题标题】:.Net Assembly Binding Redirect with Differing Public Key Tokens具有不同公钥令牌的 .Net 程序集绑定重定向
【发布时间】:2010-02-03 10:43:57
【问题描述】:

如果公钥令牌在旧版本上为空并在新版本上设置,是否可以在引用程序集的不同版本之间执行程序集绑定重定向?

例如,我有两个程序集...

System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

以下程序集绑定重定向是否应该在 Asp.Net web.config 中工作...

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
      <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

【问题讨论】:

    标签: .net asp.net assemblybinding publickeytoken


    【解决方案1】:

    不,这是不可能的。程序集需要具有相同的 publicKeyToken。

    bindingRedirect 标记只有 oldVersion 和 newVersion 属性,所以无论如何都无法告诉它“null”版本。

    但背后的真正原因是strong name mechanism解释的

    【讨论】:

      【解决方案2】:

      您也许可以使用AppDomain.AssemblyResolve 事件来做到这一点。我在this answer 中包含了一些示例代码。

      【讨论】:

      • 遗憾的是,公钥令牌似乎仍然必须匹配。当我尝试手动加载不同的程序集(使用 bindingRedirect 或不使用)时,我得到“找到的程序集的清单定义与程序集引用不匹配。”
      • @ladenedge,如果您查看我链接到的答案中的示例代码,它可以让您使用您想要决定使用哪个程序集的任何标准。在示例中,我使用了程序集名称并忽略了公钥标记。请注意,我的示例是从文件中动态加载程序集,而不是在启动时。公平地说,我没有尝试做你所说的事情,所以这可能是不可能的。
      【解决方案3】:

      似乎无法使用绑定重定向,但在我的情况下,我确实设法通过修改引用 DLL 中请求的令牌值来解决不同 publicKeyTokens 的问题:

      将 dll 反汇编为 IL,更改引用,重新组装(并重新签名 - 如果您没有密钥文件,这可能是个问题)。

      (见我对when referencing assemblies, is it possible to insist on a version number but ignore the publickeytoken? (ie accept signed/unsigned)的评论)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多