c# - 新的 DLL hell ;绑定(bind)了错误的程序集版本

标签 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 版本不正确导致的绑定(bind)错误,返回了“500 Intrernal Server Error”。

为什么构建程序集会影响非依赖程序集?

有没有人遇到过这种情况?

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


编辑 2014 年 6 月 19 日

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

如果我编辑 AppBase,使其不引用 System.Web.Http,效果就会消失。 也许这与 Program Files 中的 MVC 内容有关? ...


编辑 2014 年 6 月 20 日

我发布了 community wiki answer详细说明了我是如何解决这个问题的。我想有人可能会觉得它有用。但是,当我仅构建 AppBaseBase 时,解决方法并未解释影响 Server 的机制。这听起来像是一个错误,似乎是错误的吗?

最佳答案

AppBase 中对 System.Web.Http 的引用指向

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)

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 文件,所有文件都绑定(bind)重定向到最新版本的 Newtonsoft.Json


注意

我实际上认为这是一种变通方法,但我很高兴找到它。

AppBase 中的代码实际上并不需要最新的System.Web.Http.dll。 我仍然不知道为什么构建 AppBase 会影响 Server,这是一个错误吗?

将有问题的 DLL 标记为只读并不能保护它们。确实更改了安全权限,但在构建 AppBase 期间没有记录错误,即使使用诊断构建日志也是如此。

关于c# - 新的 DLL hell ;绑定(bind)了错误的程序集版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24309315/

相关文章:

c# - 在 ICollectionView 中过滤对象的子项

visual-studio - 'EurekaPackage' 包未正确加载 - Visual Studio 2013

c# - 初始化从“编辑”、“选择性粘贴”、“将 XML 粘贴为类”获得的 xml 类

c# - 以数字为键反序列化 JSON

c# - 如何将纯文本json数据转成字符串?

c# - 将单个对象插入 json 文件而不重写整个文件

c# - 实现 Rx 处理程序的最佳实践是什么?

c# - 递归 yield

javascript - 将数组从代码隐藏例程传递到 javascript

c# - 我的 C# 代码在 Visual Studio 2013 上无法正常工作