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


我正在使用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。 二进制文件 AppBase 和 Base 正如预期的那样是“最新的”。

然而,

这是重要的一点

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

当我提出要求时 Server,由于错误导致的绑定错误,返回“500 Intrernal Server Error” Newtonsoft.Json DLL版本。

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

有没有人经历过这个?

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


编辑 19/06/2014

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

如果我编辑 AppBase 所以它没有参考 System.Web.Http 效果消失了。 也许这与Program Files中的MVC有关? ...


编辑 20/06/2014

我发布了一个 社区维基回答 详细说明我是如何解决这个问题的。我以为有人可能觉得它很有用。但是,解决方法并不能解释影响哪种机制 Server 当我只建立 AppBase 和 Base。这听起来像个臭虫,看起来不对吗?


45
2018-06-19 14:39


起源


所以你说没有建设 Server,它确实取代了它的一些依赖程序集 bin 夹?我不太明白你的问题。 - Patrick Hofman
您是否尝试过将程序集重定向绑定到最新版本?这就是我遇到类似问题时所做的事情,并且工作正常。 - Jon Skeet
@JonSkeet:这也是我提出的解决方案,但我不知道我是否正确理解了这个问题(这是否回答了问题)。 - Patrick Hofman
如果也有这个问题...... VS正在从Visual Studio的Blend子目录中复制v4.5 DLL。不知道为什么呢...... - Gene
您是否能够在新的解决方案中重现此问题,进行相同的设置? - Stijn


答案:


引用 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 现在,WepApi DLL中 Server 不再被改为旧版本。


顺便,

此包更改增加了多个 (a|A)pp.config 解决方案项目中的文件,所有文件都绑定重定向到最新版本 Newtonsoft.Json


注意

我实际上认为这是一个工作,虽然我很高兴找到。

代码在 AppBase 实际上并不需要最新的 System.Web.Http.dll。 我还是不知道为什么要建造 AppBase 应该有效果 Server这是一个错误吗?

将麻烦的DLL标记为只读不会保护它们。更改了安全权限,但在构建期间未记录任何错误 AppBase,即使使用诊断构建日志记录。


3
2018-06-19 22:32



当包更新时,这不会被覆盖吗? - Patrick Hofman
@PatrickHofman,我想是的,但是既然如此 AppBase 和 Server 使用它应该排队的包。我怀疑如果 Newtonsoft.Json 4.5 在我的存储库中可用,我可能仍然有问题,因为WepApi依赖于旧版本。我可以通过明确地将6.0.3版本拉入其中来解决这个问题 AppBase。 - Jodrell
@PatrickHofman这仍然没有解释为什么建设 AppBase 应该有效果 Server (我认为不应该。) - Jodrell
我知道。我也想知道答案。 - Patrick Hofman


Nuget安装所选的包及其依赖的任何其他包。 显然,在你的Server解决方案中有使用Newtonsoft.Json v4.5的软件包,所以Nuget将dll复制到bin,就会出现问题。

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

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


1
2017-07-11 08:16



解决方案中没有4.5包(并且不需要,因为6.0.3满足> = 4.5的依赖性)。 VS正在将文件从其他位置复制到输出文件夹中。 - Gene
所以当我建立的时候 AppBase 和 Base 只有Nuget将一些包复制到 Server bin文件夹? - Jodrell
如果是这样,Nuget会检查绑定重定向并协商到最高版本吗? - Jodrell
@Gene:很难说在没有检查解决方案Base.csproj,AppBase.csproj和Server.csproj的情况下,是否有关于Newtonsoft.Json 4.5软件包的引用。我会寻找Reference Include节点和相应的HintPath。 - Artem
@Jodrell:通过说“Nuget拷贝”,我在技术上并不正确,因为Nuget将对包文件夹的适当引用添加到项目中。当项目文件包含对packages文件夹中dll的引用时,VS可以在本地构建和复制这些程序集。解析绑定重定向是CLR工作。 Nuget不会管理对同一程序集的两个版本的引用,我认为在VS中也是有问题的(不确定Aliases属性是否可以帮助?)。 - Artem


我怀疑您遇到的问题与解决方案的包缓存有关。

试试这个程序,如乔丹沃尔特的答案所述 这个帖子


0



这不是它,但是packages文件夹导致了我们遇到的其他问题。 packages文件夹现在在我们的 .gitignore。即使在删除packages文件夹后自动恢复,问题中的问题也会再次发生。 - Jodrell
@Jodrell好的,我听到你了。在计算机A上添加新的Nuget包,提交,然后从计算机B中提取时,有什么影响?您现在还需要在计算机B上手动添加Nuget包吗?你需要让Nuget在构建期间下载丢失的包吗? - Sir Juice
每个项目 packages.config 在源代码管理下,我们会分享每个项目使用的软件包。唯一的影响是,当你从Git中提取解决方案时,包缓存就在了 <solution>\Packages 文件夹不存在。因此,当您执行第一次构建时,将从包源下载所有包。如果您正在使用持续集成和 MSBuild 你必须添加一个使用的预构建步骤 NuGet.exe 去做这个。 - Jodrell