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

时间:2014-06-19 14:39:02

标签: 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.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,而没有构建ServerAppBase仅依赖Base。 正如预期的那样,AppBaseBase的二进制文件是“最新的”。

然而,

这是重要的一点

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,详细说明了我是如何解决这个问题的。我以为有人可能觉得它很有用。但是,当我仅构建ServerAppBase时,解决方法无法解释影响Base的机制。这听起来像是一个错误,似乎错了吗?

3 个答案:

答案 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

中尝试这个程序