58

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

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

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>
4

3 回答 3

45

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

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

但背后的真正原因是由于强名称机制

于 2010-02-03T12:16:18.073 回答
6

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

于 2010-02-26T20:48:00.237 回答
1

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

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

(参见我在引用程序集时的评论,是否可以坚持使用版本号但忽略 publickeytoken?(即接受签名/未签名)

于 2014-10-29T15:04:40.730 回答