无法加载文件或程序集 'System.ValueTuple'

Could not load file or assembly 'System.ValueTuple'

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

Unexpected Error Could not load file or assembly 'System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.

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

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

我通过在计算机的 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>

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

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

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

解决方案原来是,将System.ValueTuple Nuget包降级为4.3.0然后它奏效了,就像什么都不是问题一样。

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

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

  <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 主要应用程序。

我真的只是看看发生了什么,看看是否存在潜在的依赖关系或其他问题,没想到 运行。 一直在用,我这几天添加的新功能都还在用。

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

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

(Using SQLite on AWS EC2)

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

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

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

System.ValueTuple now supports .NET Framework 4.7

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

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

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

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

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

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

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

所以这就解决了。

在我的例子中,我认为有些东西从项目和框架文件夹中删除了这个 dll,也许是在安装它运行的东西的过程中;所以我的项目在调试期间找不到那个 dll 并抛出那个错误。我安装了

Install-Package System.ValueTuple -Version 4.5.0

打包,一切都恢复正常了。在按照上述答案进行进一步复杂的解决方案之前,安装 ValueTuple 包 对你有用。

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

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

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

添加 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>

这为我消除了错误。

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

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

通过安装 VS 2019 解决了。

我希望这不是线程死灵法术,因为这仍然是 Google 上搜索排名第一的东西。 None 其他评论对我来说很遗憾。

在解决这个问题一年多之后,我们最近解决了这个问题。问题是一个名为“GitVersion”的包。因此,对于仍在为此苦苦挣扎并浏览论坛的任何人,我知道有很多人是;我建议您检查您的软件包并查看它们的依赖项。

通过将我对 System.ValueTuple 的引用上的复制本地标志从始终复制更改为 none 来解决此问题。 (它在包含测试的程序集上)。

右键单击引用并选择“迁移 packages.config 到 PackageReference...”解决了我的问题(以及其他类似问题)。