C# 新地狱;绑定的程序集版本错误
我正在使用Nuget v 2.8.50313.46运行VS2013更新1 您可以跳到这是重要的一点,以及一些最新的更新,然后返回以供参考 我有一个VS解决方案,这是它的简化表示C# 新地狱;绑定的程序集版本错误,c#,visual-studio-2013,json.net,nuget,C#,Visual Studio 2013,Json.net,Nuget,我正在使用Nuget v 2.8.50313.46运行VS2013更新1 您可以跳到这是重要的一点,以及一些最新的更新,然后返回以供参考 我有一个VS解决方案,这是它的简化表示 -- Solution - Base (Class Library) Packages: No Packages Installed. References: System System.Configurati
-- 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
服务器中的代码需要Newtonsoft.Json v6.0.3
才能运行
当我重建所有并运行时,一切正常,正如预期的那样
随后,我只构建了AppBase
,而没有构建Server
AppBase
仅依赖于Base
。
正如预期的那样,AppBase
和Base
的二进制文件是“最新的”
但是,
这是重要的一点
AppBase
的构建导致“Server\bin”文件夹中的Newtonsoft.Json.dll
被替换为早期的4.5版本
当我向服务器
发出请求时,由于不正确的Newtonsoft.Json
dll版本导致绑定错误,将返回一个“500 intreral Server Error”
为什么构建程序集会影响非依赖程序集
还有其他人经历过吗
解决这个问题的最佳方法是什么
编辑2014年6月19日
我制作了一个新的解决方案文件,起初我认为这已经解决了问题。
但是,问题已转移到系统.Net.Http.Formatting.dll
:-S
如果我编辑AppBase
,使其不引用System.Web.Http
,效果就会消失。
也许这与程序文件中的MVC内容有关
编辑2014年6月20日
我已经发布了一篇文章,详细说明了我是如何解决这个问题的。我想有人会觉得它有用。但是,该解决方案没有解释当我仅构建AppBase
和Base
时,是什么机制影响Server
。这听起来像是一个bug吗?它似乎是错的?Nuget安装所选的软件包以及它所依赖的任何其他软件包。
显然,在您的服务器解决方案中,有使用Newtonsoft.Json v4.5的包,因此Nuget将dll复制到bin,这样就出现了问题
您可以使用Jon Skeet评论的方法,也可以坚持在服务器解决方案中使用Newtonsoft.Json v4.5
另一个选项用于引用此dll的两个不同版本。在AppBase
中对System.Web.Http
的引用指向
C:\ProgramFiles(x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assembly\System.Web.Http.dll
我添加了我最新的
打包到AppBase
,如Server
中所用。这就引入了依赖包
AppBase
中的System.Web.Http
参考现在指向
MySolutionFolder\packages\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
,这是一个bug吗
将有问题的DLL标记为只读并不能保护它们。更改了安全权限,但在生成AppBase
期间未记录任何错误,即使使用诊断生成日志记录也是如此。我怀疑您遇到的问题与解决方案的包缓存有关
请按照Jordan Walter在中的回答尝试此过程,您的意思是,如果不构建服务器
,它会替换其bin
文件夹中的一些依赖程序集?我不太理解您的问题。您是否尝试过将程序集重定向绑定到最新版本?当我遇到类似的问题时,我就是这么做的,而且效果很好。@JonSkeet:这也是我提出的解决方案,但我不太清楚我是否正确理解了这个问题(这是否回答了问题)。如果我也有这个问题。。。VS正在从Visual Studio的Blend子目录复制v4.5 DLL。现在还不知道为什么……您能够在一个新的解决方案中重现这个问题,进行相同的设置吗?解决方案中没有4.5包(并且不需要,因为6.0.3满足>=4.5的依赖关系)。VS正在将文件从其他地方复制到输出文件夹中。因此,当我仅构建AppBase
和Base
时,Nuget是否将一些包复制到服务器
bin文件夹中?如果是,Nuget会检查绑定重定向并协商到可能的最高版本吗?@Gene:如果不检查solutions Base.csproj、AppBase.csproj和Server.csproj,很难判断Newtonsoft.Json 4.5包上是否有引用。我会查找引用Include节点和相应的HintPath。@Jodrell:我说“Nuget copies”在技术上是不正确的,因为Nuget会将对包文件夹的适当引用添加到项目中。当项目文件包含对packages文件夹中DLL的引用时,VS可以在本地生成和复制这些程序集。解析绑定重定向是CLR的工作。Nuget不会管理对同一程序集的两个版本的引用,我认为在VS中也会有问题(不确定Alias属性是否有帮助?)。当包更新时,这不会被覆盖吗?@Patrickhoffman,我想是的,但是既然AppBase
和Server
都使用包,它应该按顺序进行。我怀疑
Microsoft.AspNet.WepApi.Core 5.1.2
Microsoft.AspNet.WebApi.Client 5.1.2
Newtonsoft.Json 6.0.3 (the only version in my package source)