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

Mik*_*ery 42 .net c# 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并希望它包括这个组件?

Dje*_*sen 27

我自己就是这个问题.在开发时不在Localhost上,但仅在生产服务器上.最后,结果发现.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时遇到了问题. (2认同)
  • 也为我工作 - 我有一个针对.NET Standard 1.3的类库,它由一个针对2.0的AspNetCore项目使用.降级到4.3.0修复了问题 - 谢谢! (2认同)

Rob*_*sey 19

好的,这感觉完全不对,但是我剪了

  <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>
Run Code Online (Sandbox Code Playgroud)

这从我的主要应用程序的web.config中出来。

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


小智 18

添加 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>
Run Code Online (Sandbox Code Playgroud)

这为我消除了错误。


mal*_*ier 9

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


Ond*_*ras 8

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


Mik*_*ery 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>
Run Code Online (Sandbox Code Playgroud)

  • .System Framework 4.7已添加“ System.ValueTuple”。 (6认同)
  • 这让我很接近,但对于 nuget 版本 4.5,我必须在 Windows 服务配置中使用以下内容 &lt;dependentAssembly&gt; &lt; assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51"culture="neutral" /&gt; &lt;bindingRedirect oldVersion="0.0 .0.0-4.0.3.0" newVersion="4.0.3.0" /&gt; &lt;/dependentAssembly&gt; (2认同)

Ogg*_*las 5

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

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

  • 发现一个随机服务器只安装了4.6。这个答案应该是所有其他答案之前的起点。 (2认同)