【问题标题】:Could not load file or assembly 'System.ValueTuple'无法加载文件或程序集“System.ValueTuple”
【发布时间】:2017-08-09 14:18:41
【问题描述】:

我有一个 VS2017 项目,它编译为一个 DLL,然后由其他人编写的 EXE 调用。这两个项目都针对 .Net Framework 4.6.2。我重写了我的一个 DLL 方法以返回一个元组,并导入了关联的 NuGet 包。当我编译项目时,它在输出目录中包含 System.ValueTuple.dll,然后将其部署到我的 DLL 加载并由 EXE 调用的其他机器。但是当 EXE 尝试调用返回元组的方法时,它会崩溃:

意外错误无法加载文件或程序集“System.ValueTuple,Version=4.0.1.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。系统找不到指定的文件。

我不明白为什么它没有找到该文件,因为它与我的 DLL 位于同一文件夹中。显然 MS 没有在 .Net Framework 4.6.2 中包含这个程序集。

请注意,我的 DLL 是使用 machine.config 文件在 Windows 中注册的。我猜如果我也将 System.ValueTuple.dll 添加到这个文件中它会起作用(还没有尝试过,不确定这是最好的方法,尤其是长期的。)除了等待 4.6 之外,还有更好的方法吗.3 并希望它包含这个程序集?

【问题讨论】:

  • "请注意,我的 DLL 是使用 machine.config 文件在 Windows 中注册的" - 您的意思是您的 DLL 被放入 GAC,但 System.ValueTuple.dll 不是?我知道这会导致什么问题。
  • @JonSkeet 是的。但我假设 Windows 会在与调用应用程序相同的文件夹中查找引用的 DLL,在本例中是我的 DLL。
  • DLL的路径对查找程序集没有作用,只有启动EXE。
  • ValueTuple 内置于 .NET Framework 4.7 中,该版本刚刚宣布并将很快发布。也就是说,我不明白您为什么在 4.6.2 中遇到问题,因为您从 nuget 导入了 ValueTuple 包。我不是装配绑定方面的专家,但您的解决方案(如下)让我担心。随意在 rolsyn repo 上提交一个小型 repro 项目(压缩)的问题。
  • 我在更新(看似无关的)Nuget 包后遇到了同样的问题。升级到 4.7.2 解决了这个问题,但我还必须删除绑定引用。

标签: c# .net dll c#-7.0 valuetuple


【解决方案1】:

好吧,这感觉完全不对,但我删了

  <dependentAssembly>
    <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
  </dependentAssembly>

这在我的 web.config 中用于主应用程序。

我真的只是看看发生了什么,看看是否存在潜在的依赖或其他东西,没想到它会运行。 刚刚继续运行,我这几天添加的所有新功能仍然有效。

【讨论】:

  • 这对我有用。下面的 Djensen 解决方案也是必要的,因为最初我有多个项目具有不同的 nuget 版本。我怀疑发生的事情是,当它第一次构建时,它注意到不匹配,因此在 app.config 中添加了 bindingRedirect。因此,即使在将所有项目中的 nuget 引用修复为相同之后,此 bindingRedirect 仍然存在。
  • IMO,这是您需要的唯一更改才能使其正常工作。
  • 它对我有用,可能机器已经拥有它,通过从 web.config 中取出运行时的东西有帮助。谢谢你。
  • 这对我也有用。我不确定如何/何时添加此条目,但我的 DLL 版本超出了范围。
  • 据我所知,.Net Framework 中 System.ValueTuple 程序集的当前版本是 4.06.26515.6,但 nuget 包中的最新版本是 4.0.3.0。这意味着如果开发人员想要使用 nuget 包 System.ValueTuple 则需要将绑定重定向从 0.0.0.0-4.99.99.99 强制设置为 4.0.3.0。
【解决方案2】:

我自己也遇到过这个问题。开发时不在本地主机上,而仅在生产服务器上。最后,结果证明.Net Framework 4.6.1 和我在 4.5.0 版本中从 Nuget 安装 System.ValueTuple 之间存在某种冲突。

解决方案原来是,将 System.ValueTuple Nuget 包降级为 4.3.0 然后它起作用了,就像从来没有问题一样。

我怀疑这只发生在生产服务器上,因为安装了不同版本的 .net 框架。

【讨论】:

  • 这对我有用。我在 .NET Standard 2.0 项目中使用 System.ValueTuple,并且在从 .NET Core 2.0 运行它时遇到了问题,直到我降级到 4.3.0。
  • 也为我工作 - 我有一个面向 .NET Standard 1.3 的类库,它被面向 2.0 的 AspNetCore 项目使用。降级到 4.3.0 解决了这个问题 - 谢谢!
【解决方案3】:

通过在发生错误的机器上安装.NET Framework 4.7.2 Runtime 解决了这个问题。简单,无需添加bindingRedirect 或降级 NuGet 包。

https://dotnet.microsoft.com/download/dotnet-framework/net472

【讨论】:

  • 找到了一个随机服务器,它只安装了 4.6。这个答案应该是所有其他答案的起点。
【解决方案4】:

FWIW,我在使用 Moq 的测试项目中遇到了这个问题。有人将项目设置为 .NET 4.7,但我使用的是 4.6.2。还不想升级到 4.7,解决方案是将版本降级到最小起订量 4.7.145。 System.ValueTuple v 4.3.1 与它一起工作。

【讨论】:

  • Moq 4.7.145 不依赖于 ValueTuple,这就是降级有效的原因。不知道为什么最新版本的 Moq 会导致此问题。我就是这样降落在这里的。
【解决方案5】:

添加到 Robin 的答案只是更改 Web.config。 我只需要注释掉绑定重定向标签就可以逃脱。

<dependentAssembly>
    <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <!--<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />-->
</dependentAssembly>

这为我消除了错误。

【讨论】:

    【解决方案6】:

    我通过在我的计算机的 machine.config 文件中注册 System.ValueTuple 解决了这个问题(连同我自己的已经在那里注册的 DLL)。不过我并不特别喜欢这种方法,因为它依赖于随时可能更改的 DLL 版本。希望 MS 将把这个程序集添加到 .Net Framework 的下一个版本中。

    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" />
        <bindingRedirect oldVersion="0.0.0.0-99.99.99.99" newVersion="4.0.1.0" />
        <codeBase version="4.0.1.0" href="e:\exec\System.ValueTuple.dll" />
      </dependentAssembly>
      ...
    </assemblyBinding>
    </runtime>
    

    【讨论】:

    • System.ValueTuple 已添加到 .Net Framework 4.7。
    • 这让我很接近,但对于 nuget 版本 4.5,我必须在我的 Windows 服务配置中使用以下内容
    【解决方案7】:

    当 nuget 包版本不匹配时,我遇到了同样的异常。 (在 DLL 中使用的是 4.3.1,而在主程序中使用的是 4.3.0。)我已经通过将软件包升级到相同版本来解决这个问题......检查和统一软件包版本也希望对您有所帮助。

    【讨论】:

      【解决方案8】:

      我遇到了同样的问题,我通过将项目的目标框架更改为 .Net Framwork 4.7.1 来解决问题。

      System.ValueTuple now supports .NET Framework 4.7

      【讨论】:

        【解决方案9】:

        我的问题是我针对 4.6.1 进行开发,但在 4.7.2 上发布。幸运的是我不介意这个项目是为哪个 .Net 框架构建的,所以我在我的开发者实例上安装了 4.7.2,然后升级了所有的 Nuget 包。

        (Using SQLite on AWS EC2)

        【讨论】:

          【解决方案10】:

          在我的解决方案中,我发现了 2 个不同的麻烦制造者。在 App.config 或 Web.config 文件中:

          1. 版本不匹配:通过 NuGet 安装的版本与配置文件中的版本不匹配。解决方法:在.config文件中手动更改版本。

          2. 重复条目:我发现 ValueTuple 的重复条目。在我的情况下,一个用于 4.0.3.0,另一个用于 4.5.0。删除旧条目解决了这个问题。

          在另一种情况下,我设法通过删除不需要的引用并完全摆脱 ValueTuple NuGet 包来解决问题。

          【讨论】:

          • 当您说重复条目时:您是指不同项目中的不同版本吗?我有这个并将它们全部设置为相同的版本为我解决了这个问题。
          【解决方案11】:

          在我的情况下,我认为有些东西会从项目和框架文件夹中删除这个 dll,可能是在安装它飞过的东西时;所以我的项目在调试过程中找不到那个dll并抛出那个错误。我安装了

          Install-Package System.ValueTuple -Version 4.5.0

          打包,然后一切都恢复了。在执行上述更复杂的解决方案之前,可能会安装 ValueTuple 包 适合您。

          【讨论】:

            【解决方案12】:

            如果您在任何项目中引用了 AutoMapper 8.0 或更低版本,则可能是问题的根源。请参阅this github issue 了解更多信息。

            如果我理解正确,问题是低于 4.7 版的 .NET Framework 版本默认不附带 System.ValueTuple,因此 AutoMapper 使用 NuGet 包引用作为程序集,因为它具有构建目标低于 4.7 的框架版本。这导致了一些时髦的微软东西

            最简单的解决方案是将您的 AutoMapper 引用升级到 version 8.1.0 或更高版本,他们已经从代码库中删除了该程序集的所有用途并删除了依赖项。

            【讨论】:

            • source 是框架本身,我们都是受害者 :)
            【解决方案13】:

            我在 Windows Server 2016 上遇到了同样的错误“无法加载文件或程序集 System.ValueTuple.dll...”。但是,该站点在我的开发机器上运行良好。

            我的解决方案很简单,我从我的开发机器上抓取了这个 dll 并将它放到服务器上站点的“bin”文件夹中。它奏效了。

            【讨论】:

              【解决方案14】:

              我希望这不是线程死灵术,因为这仍然是 Google 上排名第一的搜索内容。遗憾的是,其他 cmets 都没有为我工作。

              在解决此问题一年多后,我们最近解决了此问题。问题是一个名为“GitVersion”的包。因此,对于仍在为此苦苦挣扎并环顾论坛的任何人,我知道很多;我建议你检查你的包,看看它们的依赖关系是什么。

              【讨论】:

              • 这是唯一对我有帮助的建议!
              【解决方案15】:

              从 .NET 4.5.1 升级到 4.6.1 后,AutoMapper 8.0.0.0 依赖于 4.5 版本时遇到了同样的问题。重新安装 automapper nuget 包对我有用。

              【讨论】:

              • 我必须将 AutoMapper 降级到 6.2.2 才能正常工作。
              【解决方案16】:

              如果您无法将 .Net Framework 更新到最新版本,则将 Package: Microsoft.Net.Compilers 降级到最高 2.10 的版本。这解决了我的问题。

              【讨论】:

                【解决方案17】:

                我有一个使用较新版本的 System.ValueTuple NuGet 包的库。然后我使用了另一个库,这导致我第一次使用安装在主项目中的旧版本。这导致这个异常暴露出来。更新两者(或以任何方式将它们融合 - 降级也可以) - 解决了问题。

                【讨论】:

                  【解决方案18】:

                  我通过从 nuget 安装 System.ValueTuple 解决了这个问题。它以前没有安装,但我猜 RestSharp 或其他库正在使用它。

                  这样就解决了。

                  【讨论】:

                    【解决方案19】:

                    通过安装 VS 2019 解决了。

                    【讨论】:

                      【解决方案20】:

                      通过将我对 System.ValueTuple 的引用上的 Copy Local 标志从 copy always 切换为 none 来解决此问题。 (它在一个包含测试的程序集中)。

                      【讨论】:

                        猜你喜欢
                        • 2023-03-28
                        • 2019-02-01
                        • 2020-08-17
                        相关资源
                        最近更新 更多