新的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
,而不构buildServer
。 AppBase
只依赖于Base
。 如预期的, AppBase
和Base
的二进制文件是“最新的”。
然而,
这是重要的一点 ,
AppBase
的build立会导致在“Server \ bin”文件夹中的Newtonsoft.Json.dll
replace早期的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立AppBase
和Base
。 这听起来像一个错误,这似乎是错误的?
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)
AppBase
的System.Web.Http
引用现在指出,
MySolutionFolder \ packages \ Microsoft.AspNet.WebApi.Core.5.1.2 \ lib \ net45 \ System.Web.Http.dll
当我现在生成AppBase
, Server
的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的回答,在这篇文章中尝试一下程序