【问题标题】:Force application to use NuGet version of library instead of GAC强制应用程序使用 NuGet 版本的库而不是 GAC
【发布时间】:2018-05-20 13:18:19
【问题描述】:

我有一个针对 .NET 4.6 的控制台应用程序,它依赖于 NuGet 包 System.Net.Http v2.0.20126.16343。一切正常,直到我决定将我的 Visual Studio 安装从 15.2 (26430.14) 升级到 15.7.1 (27703.2000),因为通知。

升级后,我的应用程序无法构建,并且我在 System.Net.Http 上缺少引用,即使该包存在。如果我再次删除并添加包,Visual Studio 会从 GAC 引用库,而不是包文件夹。

如果我将 System.Net.Http 包升级到 v4.3.3,我可以成功构建我的应用程序的唯一方法,但由于我无法控制的限制,我现在无法升级任何 NuGet 包。由于外部限制,我也将无法卸载 Visual Studio 并再次返回 v15.2。

在使用 VS 15.7.1 时,有什么方法可以解决这个问题并继续使用 System.Net.Http 的 v2.0.20126?

感谢您的帮助!

【问题讨论】:

    标签: .net visual-studio-2017 nuget nuget-package


    【解决方案1】:

    强制应用程序使用 NuGet 版本的库而不是 GAC

    那是因为您的控制台应用程序针对 .NET 4.6。 nuget 包用于.NET 4.0 (System.Net.Http 不存在。当您的应用以.NET Framework 4.5+ 为目标时,它只会转发到作为平台一部分的System.Net.Http

    这是在 .NET Framework 4.5+ 上运行的应用程序设计的。

    因此,要解决此问题,您可以将项目切换到 .NET 4.0 配置文件:

    1. 将我的项目切换到 .NET 4.0 配置文件。
    2. 已卸载 Web API NuGet 包。
    3. 再次安装 Web API (Beta) NuGet 包。
    4. 已验证 .csproj 文件包含所有引用的程序集,因此它将始终从 Bin 文件夹而不是 GAC 中获取。

    认证:Could not load file or assembly 'System.Net.Http, Version=2.0.0.0 in MVC4 Web API

    如果您不想将您的项目切换到 .NET 4.0,您可以尝试 magicandre1981 的建议,将该包更新到 4.1.0+,其中包括 .net 4.6 库。

    此外,您可以参考this thread了解更多详情。

    希望这会有所帮助。

    【讨论】:

    • 嗨,Leo,感谢您的回复。虽然我知道该包不适用于 4.5,但为什么旧版本的 Visual Studio 允许针对 4.6 的解决方案引用不适用于 4.6 的包? @magicandre1981 的解决方案似乎也不起作用。关于将项目降级到 4,这是不可能的,因为存在基于 4.6 构建的依赖项。
    • @Balaji,感谢您的回复。确实,这是将 Visual Studio 更新到 15.7 后的问题,有人已经报告了这个问题,但没有得到确切的答复。解决方法是将软件包更新到 4.1.0+,这不适合您吗?还是您只想使用 v2.0.20126 版本?
    • @Balaji,这个问题有什么更新吗? .NET Framework 4.5+ 附带了可以使用的 System.Net.Http 程序集,因此无需引用任何 nuget 包。您可以查看 davidsh 的评论以了解详细信息 如果您正在构建 .NET Framework 4.6.x 应用程序,您应该只使用对 System.Net.Http 的标准引用,而不是为 System.Net 引入任何 Nuget 包。 Http. github.com/dotnet/corefx/issues/25773
    【解决方案2】:

    添加app.config 并为System.Net.Http 添加assemblyBinding

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Net.Http" publicKeyToken="3750abcc3150b00c" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.3.3.0" newVersion="2.0.20126.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    

    (我没试过,看看你的旧版本是否适用)

    但是这个包只适用于 .net 4.0 并且对 .net 4.6 没有任何意义。这里最后一个 4.3.3 有一个 .net 4.6 库,它添加了新功能。所以将 Nuget 包更新到最新版本 4.3.3 会是更好的解决方案。

    【讨论】:

    • 感谢您的回复。明天在工作中尝试并回复您。另外,4.3.3 是否向后兼容 2.0.20126?这不是我的项目,我不确定他们用它做什么。升级到 4.3.3 会破坏什么吗?
    • 这个包只给.net 4.0增加了新的东西,所以对于你的.net 4.6,你可以删除这个包或者尝试上一个4.3.3。试一试它的用途。
    猜你喜欢
    • 2018-05-22
    • 2010-11-02
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多