87

我有一个 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 并希望它包括这个组件?

4

20 回答 20

69

好的,这感觉完全错误,但我剪了

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

我真的只是看看发生了什么,看看是否存在潜在的依赖或其他东西,而不是期望它会运行。它只是继续工作,我在过去几天添加的所有新功能仍然有效。

于 2018-11-28T05:09:34.057 回答
51

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

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

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

于 2018-06-01T06:01:14.247 回答
18

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

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

于 2019-05-29T09:51:08.230 回答
11

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

于 2018-01-11T21:32:39.380 回答
10

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

这为我摆脱了错误。

于 2020-09-24T14:08:54.280 回答
8

我通过在我的计算机的 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>
于 2017-03-18T19:53:59.990 回答
8

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

于 2017-05-17T08:50:23.487 回答
2

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

System.ValueTuple 现在支持 .NET Framework 4.7

于 2019-07-18T14:22:42.463 回答
1

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

在 AWS EC2 上使用 SQLite

于 2019-04-28T09:13:24.883 回答
1

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

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

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

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

于 2020-01-09T11:30:22.330 回答
1

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

安装包 System.ValueTuple -版本 4.5.0

包,然后一切都再次起作用。在按照上述答案进行更复杂的解决方案之前,安装ValueTuple 包可能对您有用。

于 2020-06-18T06:17:52.633 回答
1

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

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

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

于 2020-07-16T12:35:52.600 回答
1

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

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

于 2020-11-03T00:16:39.250 回答
1

我希望这不是线程死灵法,因为这仍然是 Google 上搜索到的第一名。可悲的是,其他评论都没有对我有用。

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

于 2021-03-19T10:02:32.250 回答
0

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

于 2019-02-25T16:33:34.323 回答
0

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

于 2019-08-16T18:39:52.070 回答
0

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

于 2019-10-28T17:17:51.043 回答
0

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

所以这解决了它。

于 2020-06-13T18:36:12.703 回答
0

通过安装 VS 2019 解决了这个问题。

于 2020-11-26T12:53:30.773 回答
0

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

于 2021-12-16T14:54:17.167 回答