Visual Studio 2017 - 无法加载文件或程序集“System.Runtime,Version=4.1.0.0”或其依赖项之一
Posted
技术标签:
【中文标题】Visual Studio 2017 - 无法加载文件或程序集“System.Runtime,Version=4.1.0.0”或其依赖项之一【英文标题】:Visual Studio 2017 - Could not load file or assembly 'System.Runtime, Version=4.1.0.0' or one of its dependencies 【发布时间】:2017-08-02 23:25:05 【问题描述】:我正在使用 Visual Studio 2017 并尝试创建一个 .Net Standard 1.5 库并在 .Net 4.6.2 nUnit 测试项目中使用它。
我收到以下错误...
无法加载文件或程序集 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其其中之一 依赖关系。系统找不到指定的文件。
我尝试了以下方法:
-
参考标准库作为项目参考。错误:给我上一个错误。
为我的 Std 库创建一个 NuGet pkg 并引用它。 错误:类型是 System.String,需要 System.String。这是因为 System.Runtime 最终被项目引用,并且它具有所有标准类型的定义。
参考 NuGet pkg NetStandard.Library。 错误:给我与 # 相同的错误(“类型是 System.String,需要 System.String”)。注意:在执行此操作之前,我从项目中清除了所有 NuGet 包,然后仅添加了 nUnit 和 NetStandard.Library 包(安装了 45 个其他包)。
这是一个错误吗?有解决办法吗?任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:我遇到了同样的问题,但没有发现可行的建议解决方案。 我对这个问题的解决方案是: 检查 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:***.com/a/38603514/1145177 我从 NuGet 中提取了“4.3.0”,但出于某种原因 VS 坚持我引用“4.1.2.0”,类似的工作只是不同的版本号对我有用... 我在 MSTest 项目中遇到了像 @DavidRogers 一样的问题。合并 app.config 和 packages.config 之间的差异解决了这个问题。 是的非常感谢!这是我的 MSTest 找不到测试的解决方案[MSTest][Discovery] Failed to discover tests from assembly Reason:Could not load file or assembly 'System.Reflection, Version=4.1.1.0 etc
解决方案对我有用。安装 htmlAgilityPack NUGET 后出现问题。并且由于包中的版本信息不正确而无法运行。 +1【参考方案2】:
我最近遇到了这个问题,我尝试了这个帖子和其他帖子中提到的很多东西。我通过 nuget 包管理器为"System.Runtime"
添加了包引用,修复了app.config
中的绑定redicts,并确保app.config
和package.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 引用也可以解决此问题。
【讨论】:
每当我遇到 OP 指定的问题时,我都会删除 .config 文件中的 System.Runtime 信息,这样就可以解决它。我同意你的观点,这是一个潜在的有效解决方案。当我从 nuget 添加一个包时,它往往会发生在我身上。 为我工作。将我的项目升级到 4.7.2 后出现错误xunit System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=4.1.2.0
根据您的回答,我检查了我的 nuget 包,发现我的项目之间存在“Google.protobuf”需求(合并),thnx【参考方案3】:
当您从 .NET 4.x 项目引用 .NET Standard 项目时会发生此问题:没有任何 .NET Standard 项目的 nuget 包引用作为依赖项引入。
要解决此问题,您需要确保您的 .NET 4.x csproj 文件指向当前的构建工具(至少 14 个):
<Project ToolsVersion="15.0">...
应该不再需要以下内容,它已在 VS 15.3 左右修复:
在 VS2017 中有一个 known bug,特别是在 NuGet 4.0 中。
要解决该错误,您需要为您的 .NET 4.x 项目打开 .csproj 文件并添加此 sn-p:
<ItemGroup>
<PackageReference Include="Legacy2CPSWorkaround" Version="1.0.0">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
</ItemGroup>
NuGet 4.x 带来了“包参考”——不再有 packages.config——但旧的 4.x 管道在 VS2017 发布时并未完全更新。上面的 sn-p 似乎“唤醒”了构建系统以正确包含依赖项中的包引用。
【讨论】:
Visual Studio 17 的哪个更新?可以指定版本吗? 我在 15.5.5 VS2017 还是有这个问题。看起来还有其他原因。 问题:您的 .NET 4.x 项目是使用包引用,还是仍在使用 packages.config?我想知道这对我来说似乎是固定的原因是我已经摆脱了 packages.config。 值得注意的是,Visual Studio 2017 版本 15.7 及更高版本支持将项目从 packages.config 管理格式迁移到 PackageReference 格式。 docs.microsoft.com/en-us/nuget/reference/… 关键:更新工具链后,您需要重新生成程序集绑定。这将从它们中删除System.Runtime
引用。【参考方案4】:
相信我,我不是在开玩笑。 从您的 app.config 中删除所有 System.Runtime 依赖项,它将开始工作。
【讨论】:
更好地解释为什么这样做会很有帮助。 这种方法的问题是,每当你更新任何nuget包或添加新的nuget包时,它都会被再次添加。【参考方案5】:我通过引用 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.Runtime
、System.Reflection
或System.Runtime.InteropServices
以外的任何内容(例如System.Linq
),则只需添加一个新的dependentAssembly
节点。
编辑 2
在新的 Visual Studio 版本(我认为是 2017 15.8)中,Studio 可能会创建 app.config 文件。只需选中 Project-Properties - Application 中的 Auto-generate binding redirects 复选框即可。
编辑 3
自动生成绑定重定向不适用于 .NET 类库。 将以下行添加到 csproj 文件解决此问题,并将生成 Classlibary 的工作 .config 文件。
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
【讨论】:
奇怪的是,我通过删除 System.Runtime 的所有<dependentAssembly>
节点为我解决了这个问题..
@MattBrewerton 确认!【参考方案6】:
我通过删除我的app.config
来修复它
<assemblyIdentity name="System.Runtime" ....>
条目。
app.config
在重构期间自动添加(但不需要)
【讨论】:
这对我有用!如果所有其他项目都不适合你,一定要试试这个【参考方案7】:进入 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 标准的大多数其他答案)。【参考方案8】:当您从 .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>
【讨论】:
在将项目添加为 .NET 标准后出现问题。奇怪的是,尽管删除了该项目,但问题仍然存在。【参考方案9】:我知道为时已晚,但是没有成功的答案。我从另一个网站上找到了答案。我在删除 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>
最好的问候
【讨论】:
【参考方案10】:似乎问题是由于packages.config和app.config之间存在版本冲突引起的。在 app.config 中,您拥有由名为“AutoGenerateBindingRedirects”的事物自动生成的程序集绑定重定向。每次下载 nuget 包时启用它,除了在 packages.config 中创建新条目外,还会将此绑定重定向信息添加到 app.config,这里解释了这样做的目的:Assembly Binding redirect: How and Why?
在那里你可以阅读用户@Evk 写的内容:
为什么需要绑定重定向?假设您有应用程序 A 引用库 B 以及版本 1.1.2.5 的库 C。 库 B 反过来也引用库 C,但版本为 1.1.1.0。 现在我们有一个冲突,因为你不能加载不同版本的 运行时相同的程序集。要解决此冲突,您可以使用 绑定重定向,通常是到新版本
所以, 快速修复: 删除 app.config 中的所有条目。
在我的情况下,只需执行该程序即可开始工作,但它可能只有在您在运行时没有同一程序集的任何版本冲突时才能工作。
如果你确实有这样的冲突,你应该在 app.config 中修复这些版本号以匹配实际使用的程序集版本,但是手动过程很痛苦,所以我建议通过 打开包管理器控制台再次自动生成它们并通过键入 Update-Package -reinstall
【讨论】:
【参考方案11】:我在一个针对 dotnet 框架 4.6.2 的 NUnit 2.6.4 项目中遇到了这个问题。我在尝试使用 Humanizer 时遇到了 System.Runtime FileNotFound
错误。
我通过将NetStandard.Library 安装到我的单元测试项目中来修复了我的错误。
【讨论】:
【参考方案12】:我们发现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.Runtime
重新绑定到Version=4.1.0.0
。 .net 4.7.1
附带 4.3.0.0
版本的运行时。因此,重定向绑定映射到当前版本的框架中不可用的版本。
问题已通过禁用 4.5 目标的自动绑定重定向并将其仅保留给 .net 核心来解决。
<PropertyGroup Condition="'$(TargetFramework)' == 'net45'">
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
</PropertyGroup>
【讨论】:
【参考方案13】:在通过 Nuget 添加 MsTest V2 后,刚刚在单元测试项目中遇到了这个问题。重命名 app.config(如此有效地删除它)对我有用。
阅读了以上所有帖子,我仍然不知道为什么,对不起!
【讨论】:
【参考方案14】:这个问题有很多原因......在我的情况下,问题是在我的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>
标签解决了这个问题。
【讨论】:
【参考方案15】:我的 .NET 4.6.1 网站多次遇到这种情况。每次添加对单独 .NET Core 项目的引用时,我都会遇到问题。构建后,Visual Studio 正确地提醒我此类跨框架引用无效,我迅速删除了项目引用。之后项目构建良好,但访问网站时出现 System.Runtime 错误并拒绝消失。
每次修复都很蹩脚但有效:我删除了项目目录并从源代码管理重新下载。即使之前和之后没有区别,我也能够毫无怨言地构建项目并访问页面。
【讨论】:
【参考方案16】:我在这里尝试了所有解决方案,但无济于事。最终,我通过打开新的 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>
【讨论】:
【参考方案17】:我通过删除 Nuget 包 System.Runtime
然后重新安装它解决了这个问题
【讨论】:
【参考方案18】:在运行单元测试之前,只需从 app.config 文件中删除运行时标签。问题会解决的。
【讨论】:
【参考方案19】:就我而言,我只是删除了解决方案根目录中packages
文件夹中的所有内容。
我曾尝试将对 .NET Core 3.1 Class Library
项目的引用添加到具有 ASP.NET 4.6.1
项目的解决方案中。然后我开始得到同样的错误,除了版本:Could not load file or assembly 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
。
【讨论】:
【参考方案20】:我在 VS 2017 15.45 中遇到了类似的问题 - 我在检查时发现,即使项目编译并运行它,当我尝试访问 TPL 数据流对象时,它也出现了关于 System.Runtime 的 system.IO.FileNotFoundException .
当我检查解决方案中的项目时,其中一个(最上面的)缺少底层项目使用的 System.Runtime 包。一旦我从 Nuget 安装它,它就可以正常工作了。
【讨论】:
【参考方案21】:我正在使用 ASP.Net CORE 2.1,当我从一个大型 repo 中的大约 40 个列表中选择一个 .csproj 运行时出现此错误。当我单独打开 csproj 文件时,错误已解决。打开 csproj 时,程序的启动方式有所不同。
【讨论】:
【参考方案22】:我通过从 .NET 4.7.2 => .NET 4.5.2 切换然后切换回 472 来解决此问题。 所以在某些情况下会出现这个错误是因为包管理器无法解决依赖关系
【讨论】:
【参考方案23】:如果它以前可以工作,那么应该有一个 App.config 更改。撤消 App.config 对我有用。
【讨论】:
【参考方案24】:我有一个项目有同样的问题,我通过将 dotnet core 版本从 2.2 更改为 2.0 来解决它, 如果您的问题仍然存在,请尝试此解决方案
【讨论】:
【参考方案25】:我也经历过这个错误并分享我是如何摆脱它的。
在我的例子中,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
【讨论】:
【参考方案26】:我在构建 Azure 函数时发生了这个错误(使用队列触发器,如果有影响的话)
这种情况下的问题是因为AzureFunctionsVersion
设置为 v2 而不是 v3。要通过 VS2019 更新它,请卸载项目然后编辑 csproj 文件。在PropertyGroup
节点中,添加/编辑以下内容:
<PropertyGroup>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>
【讨论】:
【参考方案27】:对我来说,这是缺少的“web.config”文件。将其添加到asp net core 3.1 app中部署的项目目录后,问题就解决了。
【讨论】:
【参考方案28】:我在关闭和重新打开项目时遇到了同样的问题,为我解决了这个问题。
【讨论】:
以上是关于Visual Studio 2017 - 无法加载文件或程序集“System.Runtime,Version=4.1.0.0”或其依赖项之一的主要内容,如果未能解决你的问题,请参考以下文章
如何修复“无法找到或打开 PDB 文件”。在 Visual Studio 2017 中
无法在 Visual Studio 2017 中加载 SDK 信息 Android SDK 管理器