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

Jod*_*ell 45 c# json.net nuget visual-studio-2013

我正在使用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
Run Code Online (Sandbox Code Playgroud)

Server需要Newtonsoft.Json v6.0.3运行的代码.

当我重建所有并运行一切正常,如预期的那样.

我随后建造AppBase,没有建筑Server.AppBase仅依赖于Base.对于二进制文件AppBase,并Base在"上最新的",符合市场预期.

然而,

这是重要的一点,

构建AppBase导致Newtonsoft.Json.dll在"Server\bin"文件夹中替换早期的4.5版本.

当我向其发出请求时Server,由于错误的Newtonsoft.Jsondll版本导致绑定错误,返回"500 Intrernal Server Error" .

为什么构建装配效果是非依赖装配?

有没有人经历过这个?

解决此问题的最佳方法是什么?


编辑 19/06/2014

我制作了一个新的解决方案文件,起初我认为这解决了问题.然而问题已转移到System.Net.Http.Formatting.dll:-S

如果我编辑,AppBase那么它不会引用System.Web.Http效果消失.也许这与Program Files中的MVC有关?...


编辑 20/06/2014

我发布了一个社区wiki答案,详细介绍了我如何解决这个问题.我以为有人可能觉得它很有用.但是,解决方法并没有解释Server当我仅构建AppBase和构建时会产生什么样的机制Base.这听起来像个bug,看起来不对吗?

小智 1

Nuget 安装选定的包及其依赖的任何其他包。显然,在您的Server解决方案中存在使用Newtonsoft.Json v4.5的包,因此Nuget将dll复制到bin中,就会出现问题。

您可以按照 Jon Skeet 的评论使用绑定重定向,或者您应该坚持在服务器解决方案中使用 Newtonsoft.Json v4.5。

另一种选择是使用extern 别名来引用该 dll 的两个不同版本。