Visual Studio 2017 - 无法加载文件或程序集“System.Runtime,Version=4.1.0.0”或其某个依赖项

140
我正在使用 Visual Studio 2017,尝试创建一个 .Net Standard 1.5 库并在 .Net 4.6.2 nUnit 测试项目中使用它。但是出现以下错误:“无法加载文件或程序集 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其中一个依赖项。系统找不到指定的文件。” 我已经尝试过三种解决方案,但都没有成功,分别是:将 Std 库作为项目引用、创建 Std 库的 NuGet 包并对其进行引用、引用 NetStandard.Library 的 NuGet 包。是否有解决方法?谢谢!
28个回答

123

我遇到了同样的问题,但找到的建议解决方法都没有用。我解决这个问题的方法是:检查App.config和packages.config是否版本匹配。

最初我的app.config包含:

<dependentAssembly>
  <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>

但是packages.config文件包含了以下内容:

<package id="System.Runtime" version="4.3.0" targetFramework="net461" requireReinstallation="true" />

我修改了app.config的条目,使其与新版本的packages.config相匹配:

<dependentAssembly>
  <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.3.0" />
</dependentAssembly>

更改后,问题得到解决。


或者只需将引用添加到您的web.config文件中:https://dev59.com/yWEh5IYBdhLWcg3wGwCO#38603514 - Doug S
8
我从NuGet中获取了“4.3.0”的代码,但出于某种原因,VS坚持让我引用“4.1.2.0”的版本。类似的解决方法在我这里起作用了,只是版本号不同而已... - David Rogers
我在一个 MSTest 项目中遇到了与 @DavidRogers 相同的问题。合并 app.config 和 packages.config 之间的差异解决了这个问题。 - Octoate
谢谢!这是我的MSTest找不到测试的解决方案[MSTest][Discovery] 无法从程序集中发现测试 原因:无法加载文件或程序集'System.Reflection, Version=4.1.1.0等 - Dan M
解决方案对我有效。问题是在安装HtmlAgilityPack NUGET后开始出现的。由于包中的版本信息不正确,因此无法运行。+1 - Yogi
同样的问题。我只是在App.Config文件中注释掉了System.Runtime部分。 - Fayssal El Mofatiche

44

最近我遇到了这个问题,尝试了在这个线程和其他线程中提到的很多方法。通过NuGet包管理器添加了“System.Runtime”包引用,修复了app.config中的绑定重定向,并确保app.configpackage.config中的程序集版本号相同。但是问题仍然存在。

最后,我删除了程序集的<dependentAssembly>标记,问题就消失了。所以,请尝试在您的app.config中删除以下内容。

<dependentAssembly>
    <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.1.0" />
</dependentAssembly>

编辑: 在我更新.NET框架到4.7.2之后,问题重新出现。我尝试了上面的技巧,但它没有起作用。浪费了很多时间后,我意识到问题是由于app.config中旧的System.Linq引用引起的。因此,要想摆脱这个问题,要么移除或更新所有Linq引用。


5
每当我遇到OP指定的问题时,我会在.config文件中删除System.Runtime信息以解决它。我同意你的看法,这是一个潜在的有效解决方案。当我从nuget添加包时,通常会发生这种情况。 - Wallace B. McClure
对我有用。在将我的项目升级到4.7.2后,我遇到了一个错误 xunit System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=4.1.2.0 - Anton Krouglov
1
根据您的回答,我检查了我的NuGet包,并发现需要在我的项目之间进行“Google.protobuf”的(合并),谢谢。 - Osama_Almaani

38
当您从.NET 4.x项目引用.NET Standard项目时,会出现此问题:没有将任何.NET Standard项目的NuGet软件包引用作为依赖项引入。
要解决此问题,您需要确保您的.NET 4.x csproj文件指向当前的构建工具(至少14):
<Project ToolsVersion="15.0">...

以下内容不再需要,已在VS 15.3左右修复:

在VS2017中存在一个已知的错误,特别是在NuGet 4.0中。

为了解决这个问题,您需要打开 .NET 4.x 项目的 .csproj 文件,并添加以下代码片段:

<ItemGroup>
  <PackageReference Include="Legacy2CPSWorkaround" Version="1.0.0">
    <PrivateAssets>All</PrivateAssets>
  </PackageReference>
</ItemGroup>

NuGet 4.x带来了“包引用”功能,不再需要使用packages.config文件。但在VS2017发布时,旧的4.x管道并未完全更新。上述片段似乎可以唤醒构建系统以正确地包括依赖项中的包引用。

Visual Studio 17 的哪个更新版本?你能具体说明一下吗? - Ronak Agrawal
12
我在15.5.5版本的VS2017中仍然存在问题,看起来可能有其他原因。 - SerG
2
值得注意的是,Visual Studio 2017版本15.7及更高版本支持将项目从packages.config管理格式迁移到PackageReference格式。https://learn.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference - tranquil tarn
从您的链接中可以看到@tranquiltarn:“目前不支持C++和ASP.NET项目的迁移。” - JP Hellemons
1
重要提示:在更新工具链后,您需要重新生成汇编绑定。这将从中删除System.Runtime引用。 - skolima
显示剩余2条评论

33

相信我,我不是开玩笑。 从您的app.config中删除所有System.Runtime依赖项,它将开始工作。


12
更好的解释为什么这会奏效会很有帮助。 - Dour High Arch
这种方法的问题在于,每当你更新任何 NuGet 包或添加新的 NuGet 包时,它都会再次添加。 - Vibgy

17

我通过引用NetStandard.Library和在NUnit项目中使用下列app.config文件解决了这个错误。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.1.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

编辑

如果除System.RuntimeSystem.ReflectionSystem.Runtime.InteropServices之外的任何内容都丢失了(例如System.Linq),那么只需添加一个新的dependentAssembly节点。

编辑2

在新的Visual Studio版本(我认为是2017 15.8)中,Studio可能会创建app.config文件。只需检查项目属性-应用程序中的自动生成绑定重定向复选框。 Auto-generate binding redirects

编辑3

自动生成绑定重定向在.NET Classlibrary中效果不佳。 将以下行添加到csproj文件中,可以解决这个问题,并生成一个适用于Classlibary的工作.config文件。

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

14
奇怪的是,我通过“删除”所有 System.Runtime 的 <dependentAssembly> 节点来解决了我的问题。 - Matt Brewerton
1
@MattBrewerton 确认了! - Bart De Boeck

14

我通过删除我的app.config文件来解决了它。

<assemblyIdentity name="System.Runtime" ....> 

条目。

app.config在重构过程中被自动添加(但不需要)。


这对我起作用了!如果其他方法都不起作用,一定要尝试这个。 - bOkeifus

5
在app.config或web.config中添加以下内容:
<dependentAssembly>
    <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>

这对我有用。问题是在添加了.NET Core项目(然后改为.NET Standard)之后开始的。即使删除引用并重置web.config(并尝试大多数提到.NET Standard的其他答案),问题仍然存在。 - d219

4
似乎问题是由于packages.config和app.config之间存在版本冲突引起的。在app.config中,你会看到名为“AutoGenerateBindingRedirects”的东西自动生成程序集绑定重定向。启用后,每次下载nuget包时,除了在packages.config中创建新条目外,还会将此绑定重定向信息添加到app.config中。其目的在这里解释:Assembly Binding redirect: How and Why? 在这里,您可以阅读用户@Evk写的内容:
为什么需要绑定重定向?假设您有一个引用库B和版本1.1.2.5的库C的应用程序A。库B又引用库C,但是版本为1.1.1.0。现在我们有了冲突,因为您不能在运行时加载相同程序集的不同版本。为了解决这个冲突,您可以使用绑定重定向,通常是指向新版本。
所以,快速解决方法:从app.config中删除所有条目。
在我的情况下,只需这样做程序就开始正常工作了,但如果你在运行时有任何相同程序集的版本冲突,则可能仍然不能正常工作。如果您确实遇到了这样的冲突,您应该修复这些版本号以匹配实际使用的程序集版本号,但手动过程非常痛苦,因此我建议您通过“打开包管理器控制台并通过输入Update-Package -reinstall来执行软件包重新安装”来再次自动生成它们。

4

这个问题有很多原因......在我的情况下,问题是在我的 web.config 文件中加了一个标签来添加 System.Runtime 组件:

<assemblies>
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</assemblies>

但是有一个包也将同一个程序集添加为依赖项,但版本不同:
<package id="System.Runtime" version="4.3.0" targetFramework="net47" />

从我的web.config中删除<add assembly>标签解决了这个问题。


3
抱歉我之前不知道,但是现在已经没有成功的答案了。我从另一个网站上找到了答案。当我删除System.Runtime程序集依赖项时,问题得到了解决。我删除了这个。
``` ```
最好的问候

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接