我正在使用Nuget v 2.8.50313.46
运行VS2013更新1您可以跳到这是重要的一点,以及最近的一些更新,然后再回来参考。
我有一个VS解决方案,这是它的简化表示。
-- 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
才能运行。
当我重建所有并运行时,一切正常,正如预期的那样。
我随后只构建了AppBase
,而没有构建Server
。 AppBase
仅依赖Base
。
正如预期的那样,AppBase
和Base
的二进制文件是“最新的”。
然而,
这是重要的一点,
AppBase
的构建导致“Server \ bin”文件夹中的Newtonsoft.Json.dll
替换早期的4.5版本。
当我向Server
发出请求时,由于错误的Newtonsoft.Json
dll版本导致绑定错误,返回“500 Intrernal Server Error”。
为什么将汇编效果构建为非依赖汇编?
还有其他人经历过这个吗?
解决此问题的最佳方法是什么?
编辑 19/06/2014
我制作了一个新的解决方案文件,起初我认为这解决了这个问题。
但问题已转移到System.Net.Http.Formatting.dll
: - S
如果我修改AppBase
,因此它不会引用System.Web.Http
,效果会消失。
也许这与Program Files中的MVC有关? ......
编辑 2014年6月20日
我发布了community wiki answer,详细说明了我是如何解决这个问题的。我以为有人可能觉得它很有用。但是,当我仅构建Server
和AppBase
时,解决方法无法解释影响Base
的机制。这听起来像是一个错误,似乎错了吗?
答案 0 :(得分:3)
System.Web.Http
中对AppBase
的引用指向
C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies \ System.Web.Http.dll
我添加了最新的
Microsoft.AspNet.WepApi.Core 5.1.2
AppBase
中的Server
包。这引入了依赖包,
Microsoft.AspNet.WebApi.Client 5.1.2 Newtonsoft.Json 6.0.3 (the only version in my package source)
System.Web.Http
中的AppBase
引用现在指向
MySolutionFolder \包\ Microsoft.AspNet.WebApi.Core.5.1.2 \ lib中\ net45 \ System.Web.Http.dll
当我现在构建AppBase
时,Server
中的WepApi DLL不再被更改为旧版本。
顺便提及,
此软件包更改在解决方案的项目中添加了多个(a|A)pp.config
文件,所有文件都绑定到最新版本的Newtonsoft.Json
。
注意强>
我实际上认为这是一个工作,虽然我很高兴找到。
AppBase
中的代码实际上并不需要最新的System.Web.Http.dll
。
我仍然不知道为什么构建AppBase
会影响Server
,这是一个错误吗?
将麻烦的DLL标记为只读并不能保护它们。更改了安全权限,但在构建AppBase
期间未记录任何错误,即使使用诊断构建日志记录也是如此。
答案 1 :(得分:1)
Nuget安装所选的包及其依赖的任何其他包。 显然,在你的服务器解决方案中有使用Newtonsoft.Json v4.5的软件包,所以Nuget将dll复制到bin,就会出现问题。
你可以使用binding redirect作为Jon Skeet评论,或者你应该坚持在服务器解决方案中使用Newtonsoft.Json v4.5。
另一种选择是使用extern alias来引用此dll的两个不同版本。
答案 2 :(得分:0)
我怀疑您遇到的问题与解决方案的包缓存有关。
按照约翰沃尔特的回答,在this post
中尝试这个程序