强制第三方程序集使用另一个程序集的不同版本

8

我正在运行集成测试,当我到达这行代码时:

        WebApiDependencyResolverConfig.Register(config); 

(在内部使用autofac容器)

我遇到了这个异常:

{"Could not load file or assembly 'System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"}

Fusionlog:

=== Pre-bind state information ===
LOG: DisplayName = System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Appbase = file:///C:/TLP/TLP.API.IntegrationTests/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : Autofac.Integration.WebApi, Version=3.0.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\TLP\TLP.API.IntegrationTests\bin\Debug\TLP.API.IntegrationTests.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config

似乎autofac web api集成仅适用于web api 2.0。当我使用不再引用system.web.http 5.0.0而是改为5.1.0的web api 2.1时,它就无法工作了。 我应该如何告诉autofac使用system.web.http 5.1.0版本而不是5.0.0? 我在我的集成测试和API项目的app.config中添加了以下内容:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Http"
                        publicKeyToken="32ab4ba45e0a69a1"
                        culture="neutral" />
      <bindingRedirect oldVersion="5.0.0.0"
                       newVersion="5.1.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
  </runtime>

但是它并没有起作用!

另一个非常奇怪的事情是,我读过使用.NET 4.5.1时,这个重定向程序集的东西会自动完成。但是它并没有发生...

2个回答

8

我已经将Web API 2.1和MVC 5.1的更新包推送到NuGet。

http://www.nuget.org/packages/Autofac.WebApi2

https://www.nuget.org/packages/Autofac.Mvc5

微软显然对语义化版本规则的解释不同,因为5.1是次要版本,应该“以向后兼容的方式添加功能”。但是5.1.0包并非如此,因为强名称程序集版本已经增加。
Autofac程序集具有强名称,但在3.0版本系列期间,仅更新了包和文件版本。程序集版本始终保持为3.0.0.0,以防止在包更新期间发生此类破坏性更改。不幸的是,我们无法控制ASP.NET依赖项,并且必须在发生这种情况时重新编译。

谢谢Alex,很好我包含了“autofac”标签的问题;-)测试了新的NuGet,它可以工作! - Pascal

4
这里这里这里所述,当引用的程序集被重新编译使用不同的强名称密钥时,会导致公钥令牌不匹配的问题。
只有将autofac库编译为较新的程序集,才能解决此问题。

那么谁应该为此负责?是微软将 System.Web.Http 的公钥搞砸了吗? - Pascal
关于你最后一句话:这不应该是Autofac作者的任务吗?我问这个问题是因为我想把这个修复作为NuGet包发布。而不是由我自己添加自定义引用... - Pascal
1
@Pascal,我已验证Web API 2和2.1的publicKeyTokens匹配。你可以尝试在你的配置中将32ab4ba45e0a69a1更改为31bf3856ad364e35吗?如果令牌已更改,那么autofac开发人员应该发布更新,但看起来并非如此。 - CodeCaster
1
太好了...它能用了,非常感谢 :) 所有使用autofac的用户都欠你一杯啤酒 :P - Pascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接