新的DLL地狱; 错误的程序集版本被绑定

我使用Nuget v 2.8.50313.46运行VS2013更新1

你可以跳到这是重要的一点 ,还有一些最近的更新,并回来供参考。

我有一个VS解决scheme,这是一个简化的表示。

-- Solution - Base (Class Library) Packages: No Packages Installed. References: System System.Configuration System.Core System.Runtime.Caching System.Web - AppBase (Class Library) Packages: No Packages Installed. References: System System.Core System.Web.Http Base - Client (Console Application) Packages: EntityFramework v6.1.0 HtmlAgilityPack v1.4.6 References: EntityFramework EntityFramework.SqlServer HtmlAgilityPack System System.Core AppBase Base - Server (Web Application) Packages: HtmlAgilityPack v1.4.6 Microsoft.AspNet.WebApi v5.1.2 Microsoft.AspNet.WebApi.Client v5.1.2 (dependent on > Newtonsoft.Json v4.5.0) Microsoft.AspNet.WebApi.Web... v5.1.2 Newtonsoft.Json v6.0.3 References: HtmlAgilityPack Newtonsoft.Json System System.Net.Http System.Net.Http.Formatting System.Web System.Web.Http System.Web.HttpHost AppBase Base 

Server的代码需要使用Newtonsoft.Json v6.0.3才能正常工作。

当我重build所有和运行一切正常,如预期。

我随后构build的只是AppBase ,而不构buildServerAppBase只依赖于Base 。 如预期的, AppBaseBase的二进制文件是“最新的”。

然而,

这是重要的一点

AppBase的build立会导致在“Server \ bin”文件夹中的Newtonsoft.Json.dllreplace早期的4.5版本。

当我向Server发出请求时,由于由不正确的Newtonsoft.Json dll版本引起的绑定错误,将返回“500 Intrernal Server Error”。

为什么构build一个assembly效果是一个非依赖的assembly?

有没有人经历过这个?

什么是解决这个问题的最好方法?


编辑 19/06/2014

我做了一个新的解决scheme文件,起初我认为这已经解决了这个问题。 但是,问题已转移到System.Net.Http.Formatting.dll :-S

如果我编辑AppBase所以它不引用System.Web.Http ,效果就消失了。 也许这是与程序文件中的MVC的东西? …


编辑 20/06/2014

我已经发布了一个社区维基答案 ,详细介绍了我如何解决这个问题。 我以为有人会觉得有用。 但是,解决方法并没有解释什么机制影响Server时,我只build立AppBaseBase 。 这听起来像一个错误,这似乎是错误的?

AppBase中对System.Web.Http的引用指向

C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies \ System.Web.Http.dll

我加了我最新的

 Microsoft.AspNet.WepApi.Core 5.1.2 

打包到Server使用的AppBase 。 这拉入了依赖包,

 Microsoft.AspNet.WebApi.Client 5.1.2 Newtonsoft.Json 6.0.3 (the only version in my package source) 

AppBaseSystem.Web.Http引用现在指出,

MySolutionFolder \ packages \ Microsoft.AspNet.WebApi.Core.5.1.2 \ lib \ net45 \ System.Web.Http.dll

当我现在生成AppBaseServer的WepApi DLL不再被修改为旧版本。


顺便,

这个包更改在解决scheme的项目中添加了多个(a|A)pp.config文件,所有(a|A)pp.config文件都绑定了redirect到最新版本的Newtonsoft.Json


注意

实际上,我认为这是一个工作,尽pipe我很高兴find。

AppBase中的代码实际上并不需要最新的System.Web.Http.dll 。 我仍然不知道为什么build立AppBase应该效果Server ,这是一个错误?

将麻烦的DLL标记为只读并不能保护它们。 更改了安全权限,但是在构buildAppBase期间没有logging错误,即使在诊断版本logging的情况下也是如此。

Nuget将安装选定的软件包以及它所依赖的其他软件包。 显然,在你的服务器解决scheme中有一些使用Newtonsoft.Json v4.5的软件包,所以Nuget将dll复制到bin,就会出现这个问题。

你可以像Jon Skeet所说的那样使用绑定redirect ,或者你应该在Server解决scheme中使用Newtonsoft.Json v4.5。

另一种select是使用外部别名来引用这个DLL的两个不同版本。

我怀疑您遇到的问题与解决scheme的包caching有关。

按照Jordan Walter的回答,在这篇文章中尝试一下程序