Visual Studio 2017-无法加载文件或程序集'System.Runtime,Version = 4.1.0.0'或其依赖项之一


103

我正在使用Visual Studio 2017,并尝试创建.Net Standard 1.5库并在.Net 4.6.2 nUnit测试项目中使用它。

我收到以下错误...

无法加载文件或程序集“ System.Runtime,版本= 4.1.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。

我尝试了以下方法:

  1. 参考标准库作为项目参考。错误:给我上一个错误。
  2. 为我的标准库创建一个NuGet pkg并引用它。错误:类型为System.String,需要System.String。这是因为System.Runtime最终被项目引用,并且具有所有标准类型的定义。
  3. 参考NuGet pkg NetStandard.Library。错误:给我与#相同的错误(“类型为System.String,需要System.String”)。注意:在执行此操作之前,我从项目中清除了所有NuGet软件包,然后仅添加了nUnit和NetStandard.Library软件包(已安装了45个其他软件包)。

这是一个错误吗?有解决方法吗?任何帮助表示赞赏。

Answers:


91

我遇到了同样的问题,没有找到可行的建议解决方案。我针对此问题的解决方案是:检查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条目以匹配newVersion的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的引用:stackoverflow.com/a/38603514/1145177
Doug S

7
我从NuGet中提取了“ 4.3.0”,但由于某种原因VS坚持我引用了“ 4.1.2.0”,类似的工作只是在不同的版本号上为我工作...
David Rogers

我在MSTest项目中遇到了类似@DavidRogers的问题。合并app.config和packages.config之间的差异可以解决此问题。
Octoate

是的,谢谢一堆!这是我的MSTest找不到测试的解决方案 [MSTest][Discovery] Failed to discover tests from assembly Reason:Could not load file or assembly 'System.Reflection, Version=4.1.1.0 etc
Dan M

解决方案对我有用。安装HtmlAgilityPack NUGET后开始出现问题。并且由于软件包中的版本信息不正确而无法运行。+1
罗伯托

35

当您从.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的哪个更新?您可以指定版本吗?
罗纳克·阿格罗瓦尔

11
在15.5.5 VS2017中我仍然有问题。看来还有其他原因。
SerG

问题:您的.NET 4.x项目是否使用包引用,还是仍使用packages.config?我想知道这对我看来固定的原因是我摆脱了packages.config。
科里·纳尔逊

2
值得注意的是,Visual Studio 2017版本15.7和更高版本支持将项目从packages.config管理格式迁移到PackageReference格式。 docs.microsoft.com/en-us/nuget/reference/...
宁静的小湖

@tranquiltarn,来自您的链接:“迁移目前不适用于C ++和ASP.NET项目。”
JP赫勒蒙斯

34

我最近遇到了这个问题,并且尝试了该线程和其他线程中提到的许多事情。我加装基准为"System.Runtime"通过NuGet包管理器,固定在结合。预测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 Framework更新到4.7.2之后,问题再次浮出水面。我尝试了上述技巧,但没有成功。浪费了几个小时后,我意识到问题是由于System.Linqapp.config 中的旧引用引起的。因此,也可以删除或更新所有Linq引用来摆脱此问题。


4
每当遇到OP指定的问题时,我都会删除.config文件中的System.Runtime信息,从而解决该问题。我同意您的看法,这是一个潜在的有效解决方案。当我从nuget添加软件包时,往往会发生这种情况。
华莱士B.麦克卢尔

为我工作。xunit System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=4.1.2.0将项目升级到4.7.2后,我遇到了错误
Anton Krouglov

根据您的回答,我检查了我的nuget程序包,并发现我的项目之间存在“ Google.protobuf”需求(合并),thnx
Osama_Almaani

28

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


9
更好地解释为什么这样做会有所帮助。
Dour High Arch '18 -4-5

这种方法的问题是,每当您更新任何nuget软件包或添加新的nuget软件包时,都会再次添加它。
维比

16

我通过在NUnit-Project中引用NetStandard.Library和以下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.Reflection或者System.Runtime.InteropServices缺少其他内容(例如System.Linq),则只需添加一个新dependentAssembly节点即可。

编辑2

在新的Visual Studio版本(我认为是2017 15.8)中,Studio可能会创建app.config文件。只需在Project-Properties-Application中选中“ 自动生成绑定重定向”复选框即可。 自动生成绑定重定向

编辑3

自动生成的绑定重定向不适用于.NET Classlibraries。将以下行添加到csproj文件即可解决此问题,并将为Classlibary生成一个有效的.config文件。

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

11
古怪,我解决了问题,我通过移除所有<dependentAssembly>节点的System.Runtime ..
马特·布鲁尔顿

@MattBrewerton确认!
Bart De Boeck

13

我通过删除我的固定它app.config

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

条目。

app.config 在重构期间自动添加(但不需要)


这对我有用!如果其他所有项目都无法满足您的需要,请一定尝试一下
bOkeifus

3

当您从.NET 4.x项目引用.NET Standard项目时,会发生此问题:.NET Standard项目的nuget程序包引用都不作为依赖项引入。

我通过添加System.Runtime 4.3和NETStandard.Library包和!! important解决了!我使用重构工具查找System.Runtime.dll版本,但4.1.1.1不是4.3,然后在.config中添加bindingRedirect

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

3

我知道为时已晚,但是没有成功的答案。我从另一个网站找到了答案。我删除System.Runtime程序集依赖项时已解决此问题。我删除了这个。

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

最好的祝福


2

在针对dotnet框架4.6.2的NUnit 2.6.4项目中,我遇到了一个问题。我在System.Runtime FileNotFound尝试使用Humanizer时遇到了该错误。

我通过将NetStandard.Library安装到单元测试项目中来修复错误。


2

我们发现这AutoGenerateBindingRedirects可能是导致此问题的原因。

观察到:以相同的项目为目标,net45并且netstandard1.5成功在一台计算机上构建,而未能在另一台计算机上构建。机器安装了不同版本的框架(4.6.1-成功和4.7.1-故障)。将第一台计算机上的框架升级到4.7.1后,构建也失败了。

Error Message:
 System.IO.FileNotFoundException : Could not load file or assembly 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
  ----> System.IO.FileNotFoundException : Could not load file or assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

Auto binding redirects是的功能.net 4.5.1。每当nuget检测到项目正在传递引用同一程序集的不同版本时,它将在输出目录中自动生成配置文件,将所有版本重定向到所需的最高版本。

在我们的情况下,它会将的所有版本重新绑定System.RuntimeVersion=4.1.0.0.net 4.7.1附带一个4.3.0.0版本的运行时。因此,重定向绑定被映射到当前版本的框架中不可用的版本。

该问题已通过禁用4.5目标的自动绑定重定向而仅将其保留为.net核心来解决。

<PropertyGroup Condition="'$(TargetFramework)' == 'net45'">
  <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
</PropertyGroup>

2

这个问题有很多原因...就我而言,问题是在我的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中删除“添加程序集”标签可解决此问题。


2

当packages.config和app.config之间存在版本冲突时,似乎引起了该问题。在app.config中,您具有由“ AutoGenerateBindingRedirects”自动生成的程序集绑定重定向。每次下载nuget软件包时启用该功能,除了在packages.config中创建新条目外,还将将此绑定重定向信息添加到app.config中,其用途如下:程序集绑定重定向:方式和原因?

在那里您可以阅读@Evk用户写的内容:

为什么根本需要绑定重定向?假设您有引用库B的应用程序A,还引用了版本1.1.2.5的库C。库B依次也引用库C,但版本为1.1.1.0。现在我们有了冲突,因为您不能在运行时加载同一程序集的不同版本。要解决此冲突,您可以使用绑定重定向,通常使用新版本

因此, 快速修复: 删除app.config中的所有条目。

就我而言,只是通过执行该程序即可开始工作,但只有在运行时同一程序集没有任何版本冲突时,它才可能有效。

如果确实存在此类冲突,则应在app.config中修复这些版本号,以匹配程序集的实际使用版本,但是手动过程很麻烦,因此我建议通过打开Package Manager控制台再次自动生成它们,并通过键入以下内容来重新安装软件包 Update-Package -reinstall


1

我在.NET 4.6.1网站上多次遇到这种情况。每次添加对单独的.NET Core项目的引用时,都会产生此问题。构建后,Visual Studio正确地警告我此类跨框架引用无效,因此我迅速删除了该项目引用。此后,项目构建良好,但是访问该网站时出现System.Runtime错误,并拒绝消失。

每次修复都是la脚但有效:我删除了项目目录,并从源代码管理中重新下载了该目录。即使之前和之后之间没有区别,我也能够构建项目并访问页面而没有任何抱怨。


1

通过Nuget添加MsTest V2之后,在单元测试项目中立即使用它。重命名app.config(如此有效地将其删除)对我有用。

阅读了以上所有文章后,我仍然不确定为什么,对不起!


1

我通过删除Nuget软件包System.Runtime然后重新安装来解决了该问题


1

放入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>

1

我有一个存在相同问题的项目,我将dotnet核心版本从2.2更改为2.0,如果仍然存在,请尝试此解决方案



0

我在VS 2017 15.45中遇到了类似的问题-当我尝试访问TPL Dataflow对象时,即使项目进行了编译和运行,但仍发现与System.Runtime有关的system.IO.FileNotFoundException出现在我身上。

当我检查解决方案中的项目时,其中一个(最上面的一个)缺少基础项目使用的System.Runtime程序包。一旦我从Nuget安装它,所有的一切都可以正常工作。


0

我在这里尝试了所有解决方案,但无济于事。最终,我通过打开新的csproj文件解决了该问题,并手动添加了以下部分:

<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
</Reference>

0

我使用的是ASP.Net CORE 2.1,当我从大型仓库中从大约40个列表中选择一个.csproj时,出现此错误。当我单独打开csproj文件时,该错误已解决。打开csproj时,程序启动方式有所不同。


0

我通过从.NET 4.7.2 => .NET 4.5.2切换到然后再切换回472来解决此问题。因此在某些情况下会出现此错误,因为程序包管理器无法解决依赖关系


0

如果以前可以正常运行,则应该对App.config进行更改。撤消App.config对我有用。


0

我也经历了这个错误,并分享了如何摆脱它。

在我的情况下,webapi项目的web.config中存在以下行,但package.config文件中没有包引用。

Webapi项目中Web.config中的代码

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

我在Web api项目的packages.config文件中添加的代码关闭元素之前。

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

在我的案例中有效的另一种解决方案:

如果您将项目复制到另一台计算机系统,该版本肯定有些短,可以将软件包版本稍有不同,可以在运行时尝试将程序集版本更改为网站/ webapi上错误给出的版本。就像在这种情况下所给的问题一样,所需的版本是“ 4.1.0.0”,因此只需尝试将web.config中的当前版本更改为错误显示的版本,如下所示

错误:

Could not load file or assembly 'System.Runtime, Version=4.1.0.0' or one of its dependencies

版本变更


0

构建Azure函数时出现了此错误(使用队列触发器,应该有所作为)

这种情况下的问题是因为将AzureFunctionsVersion设置为v2而不是v3。要通过VS2019更新它,请卸载项目,然后编辑csproj文件。在PropertyGroup节点内,添加/编辑以下内容:

<PropertyGroup>
  <AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.