【问题标题】:ASP.Net web site NuGet package dependenciesASP.Net 网站 NuGet 包依赖项
【发布时间】:2016-01-22 10:59:32
【问题描述】:

使用 Visual Studio 2013 专业版:

这是我对使用 NuGet 包的网站项目(不是应用程序)的一个小难题:

包 A 依赖包 Newtonsoft.Json

我安装包 A,然后安装它的依赖项:Newtonsoft.Json 版本 6.0.0

我测试了我的网页,一切正常……

在 Visual Studio 中,我执行以下操作:

工具 -> NuGet 包管理器 -> 管理用于解决方案的 NuGet 包……

我点击“更新”,包管理器显示 Newtonsoft.Json 有可用更新(至版本 8.0.2)

当然,想要最新最好的,我点击“更新”

Newtonsoft.Json 已下载并更新到版本 8.0.2

我再次测试我的网页,结果……

异常:System.IO.FileLoadException:无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040) 文件名:'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'

所以我的问题是:如何解决这个问题?...

我能做的唯一方法是(到目前为止),是删除所有包并再次重新安装包 A,因为它需要 Newtonsoft.Json 的 6.0.0 版

但是,如果我使用另一个依赖于不同版本的 Newtonsoft.Json 的 NuGet 包(比如说,包 B)怎么办?换句话说,如果我使用任何其他具有相同依赖但版本不同的 NuGet 包,那些使用不存在特定依赖版本的包的页面最终会引发异常?

有什么办法可以绕过这种情况——或者如果我有多个依赖于 Newtonsoft.Json 的包——所有包都必须依赖相同的版本吗?

希望我说得足够清楚,提前谢谢。

【问题讨论】:

    标签: asp.net visual-studio-2013 nuget


    【解决方案1】:

    如果更新向后兼容,您可以使用 BindingRedirect:

    <dependentAssembly>
        <assemblyIdentity name="someAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" />
        <bindingRedirect oldVersion="6.0.0.0" newVersion="8.0.2.0" />
      </dependentAssembly>
    

    这显然只适用于向后兼容的升级,如果 API 发生变化,你就有麻烦了。 更多关于 BindingRedirects 的信息可以在这里找到:

    https://msdn.microsoft.com/en-us/library/7wd6ex19(v=vs.110).aspx

    【讨论】:

    • 非常感谢。我将查看提供的文档。如果两个包可能需要不同版本的通用 DLL,那该怎么办?例如,包 A 需要 6.0 版的 Newtonsoft.Json,而包 B 需要 8 版的 Newtonsoft.Json——那么会发生什么?
    • 只要它们兼容,它应该可以正常工作,因为 BindinRedirect 告诉所有希望 6.0.0.0 使用 8.0.2.0 的东西。
    【解决方案2】:

    这是一个常见问题,正如 Kenneth 所说,如果它支持向后兼容性,它应该与“bindingRedirect”一起使用。

    “我能做的唯一方法是(到目前为止),是删除所有包 并重新安装包...”

    对于更新Nuget而不删除dll的问题,您可以安装特定版本的Nuget。

    VS -> 工具 -> Nuget 包管理器 -> 包管理器控制台 并运行以下命令,

    安装包 Newtonsoft.Json -Version 6.0.1

    您可以在此页面中查看Newtonsoft 版本的历史记录并选择所需的版本。

    这将降级/升级现有包。

    【讨论】:

    • 非常感谢您提供版本特定的 Nuget 安装命令——我将不得不花一些时间阅读 Nuget 文档。另外,如果两个包可能需要不同版本的通用 DLL,那又如何呢?例如,包 A 需要 6.0 版的 Newtonsoft.Json,而包 B 需要 8 版的 Newtonsoft.Json——那么会发生什么?
    • 好吧,(假设版本 8 不支持向后兼容性)最简单的答案是它们不能存在于一个“bin”文件夹中。您将需要弄清楚其他事情。根据我的经验,最好的选择是升级包 A 以使用最新版本的库。另一个选择是使用旧版本的 B。如果您可以控制包 A 和 B(您拥有代码),那么您很幸运。但大多数情况下,我们可以控制一个包,因此请选择最佳选项。 cntd..
    • ...这是一种非常常见的情况,尤其是当您处理第三方平台并使用自己的模块添加/扩展时。痛苦是我们需要不断升级第三方解决方案。可能存在第三方平台没有更新版本的情况。因此,这可能是一个棘手的场景,可能会严重限制使用较新版本。
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 2020-03-11
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多