C# 新地狱;绑定的程序集版本错误

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

我正在使用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
服务器中的代码需要
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)