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

时间:2017-03-17 21:33:08

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

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

19 个答案:

答案 0 :(得分:16)

我自己就是这个问题。在开发时不在Localhost上,但仅在生产服务器上。最后,结果证明.Net Framework 4.6.1与我之间存在某种冲突,我在版本4.5.0中从Nuget安装了System.ValueTuple。

解决方案原来是将System.ValueTuple Nuget软件包降级为4.3.0然后它工作,就像什么都没有问题一样

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

答案 1 :(得分:9)

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

答案 2 :(得分:8)

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

答案 3 :(得分:7)

好吧,这感觉是完全错误的,但是我裁掉了

  <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中删除。

我真的只是在查看发生了什么,以查看是否存在潜在的依赖关系或某种东西,而不希望它运行。 它只是继续工作,最近几天我添加的所有新功能仍然有效。

答案 4 :(得分:5)

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

答案 5 :(得分:1)

通过在发生错误的计算机上安装.NET Framework 4.7.2 Runtime来解决此问题。简单,无需添加bindingRedirect或降级NuGet软件包。

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

答案 6 :(得分:1)

在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>

这为我摆脱了错误。

答案 7 :(得分:1)

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

如果我理解正确,那么问题在于默认情况下,版本4.7以下的.NET Framework版本没有附带System.ValueTuple,因此AutoMapper对该程序集使用了NuGet程序包引用,因为它具有低于4.7的Framework版本的构建目标。这引起了一些笨拙的Microsoft东西

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

通过安装VS 2019解决了它。

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

就我而言,我认为有些东西可能从项目文件夹和框架文件夹中删除了该dll,也许是在安装过程中删除了。因此,我的项目在调试过程中找不到该dll并抛出该错误。我安装了

Install-Package System.ValueTuple-版本4.5.0

打包,然后一切都重新开始。在执行上述进一步的复杂解决方案之前,答案可能会为您安装 ValueTuple软件包

答案 12 :(得分:0)

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

因此,此问题已解决。

答案 13 :(得分:0)

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

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

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

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

System.ValueTuple now supports .NET Framework 4.7

答案 17 :(得分:0)

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

Using SQLite on AWS EC2

答案 18 :(得分:0)

从.NET 4.5.1升级到4.6.1后,我对4.5版的AutoMapper 8.0.0.0依赖存在相同的问题。重新安装automapper nuget软件包对我有用。