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

时间:2014-01-27 20:14:43

标签: c# .net-assembly autofac assemblybinding

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

        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。 当我使用web api 2.1时,它不再引用system.web.http 5.0.0而是引用5.1.0,那么它就不再起作用了。

如何告诉autofac使用system.web.http 5.1.0版本而不是5.0.0?

我把它放在我的集成测试AND 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 个答案:

答案 0 :(得分:8)

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

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依赖项,并且必须在发生类似事件时重新编译。

答案 1 :(得分:4)

正如hereherehere所解释的那样,当使用不同的强名称密钥重新编译引用的程序集时,会导致公钥标记不匹配。

除了通过针对较新的程序集编译autofac库之外,这无法解决。