无法加载文件或程序集“System.Net.Http,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”
Posted
技术标签:
【中文标题】无法加载文件或程序集“System.Net.Http,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”【英文标题】:Could not load file or assembly "System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 【发布时间】:2016-11-19 09:01:00 【问题描述】:我已将我的项目复制到仅安装了 Visual Studio 2015 Community 和 SQL Server 2016 Express 的干净 Windows 10 机器上。除了随 Windows 10 和 VS2015 或 SQL Server 一起安装的框架版本外,没有安装其他框架版本。
当我尝试启动 WebApi 项目时,我收到消息:
无法加载文件或程序集“System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。
项目的包包括:
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />
使用 .NET Framework 4.6.1 构建项目后,System.Net.Http
在 bin
文件夹中找不到该文件。
文件的路径指向:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.6.1\System.Net.Http.dll
System.Net.Http.Formatting
的文件路径指向:
C:\Development\MyApp\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll
整个项目应该以 4.5.1 为目标还是有其他方法可以引用正确的程序集?
【问题讨论】:
您尝试过从 NuGet 包重新安装 Web Api 吗? 相关:***.com/questions/19491860/… 在那个 SO 问题中尝试了所有建议的答案。到目前为止没有任何效果。我还为我正在使用的所有 nuget 包运行了update-package xxx -reinstall
。它也不起作用。
相关Inheritance sec rules violated by type: 'System.Net.Http.WebRequestHandler'.
请参考这个,稍后谢谢***.com/questions/50536842/…
【参考方案1】:
对我来说,我又加了nuget,问题就解决了
【讨论】:
【参考方案2】:更改我的 web.config(或 app.config)中的绑定信息 - 虽然在我看来是“hack”,但允许您在 NuGet 包更新破坏您的应用程序并为您提供系统后继续您的项目。 Net.Http 错误。
设置oldVersion="0.0.0.0-4.1.1.0"
和newVersion="4.0.0.0"
如下
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.0.0.0" />
</dependentAssembly>
【讨论】:
我部署到 Azure,一次没有问题,然后 15 分钟后,连续部署给了我 OP 中所述的确切错误,并调整了服务器上的 web.config 并修复了这个精确答案我的问题。但是,我不知道为什么它第一次起作用。我没有弄乱部署之间的依赖关系。 干得好。我可以看到发生了什么,我在一个基本域项目中安装了一个包,我很确定它安装了 System.Net.Http nuget(可能是更高的 4.1.x 版本),一旦我这样做了,我就得到了这些到处都是警告。这解决了 web 项目的问题,但是上面有人在所有项目中引用 nuget 包的建议删除了所有警告。在引用方面,我是唯一一个担心新旧 .NET 混合的人吗?这让我害怕将典型的本地 dll 引用为 nuget 包(dll 地狱)。 这里是微软关于为什么这是正确方法的回答:github.com/dotnet/corefx/issues/25773 完全删除绑定重定向对我有用。 是的,只需删除 system.net.http 和 system.runtime 的行。然后一切都会好起来的。【参考方案3】:正在使用 nuget 更新旧网站(包括 .Net 更新和 MVC 更新)。
我在 VS2017 中删除了 System.Net.HTTP 引用(它是版本 2.0.0.0)并重新添加了引用,然后显示为 4.2.0.0。
然后我使用 nuget 更新了大量“包”并收到错误消息,然后注意到某些东西已将引用重置为 2.0.0.0,所以我删除并再次重新添加,它工作正常......奇怪。
【讨论】:
【参考方案4】:VS2017 中的 4.6.1-2 用户可能会遇到不想要的 System.Net.Http 版本被 VS2017 或 Msbuild 15 想要使用的替换。
我们在这里删除了这个版本:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
这里:
C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
然后使用我们通过 NuGet 引用的版本构建项目。
【讨论】:
对我有用的是暂时从“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2”中删除 System.Net.Http,这样当我在我的项目中添加了对 System.Net.Http 的引用并选择了它实际引用的 4.0.0 版本,但这个答案实际上帮助我想到了这一点,所以谢谢:)【参考方案5】:为我 (.NET 4.6.1) 彻底解决此问题的唯一方法是,不仅为实际使用 System.Net.Http 的项目添加对 System.Net.Http V4.3.4 的 Nuget 引用,而且也适用于启动项目(在我的例子中是一个测试项目)。
(这很奇怪,因为正确的 System.Net.Http.dll 存在于测试项目的 bin 目录中,并且 .config assemblyBingings 看起来也不错。)
【讨论】:
【参考方案6】:对我来说,我已将项目设置为在最新版本的 .Net Framework 上运行(从 .Net Framework 4.6.1 更改为 4.7.2)。
一切正常,没有错误,发布也没有问题,我偶然发现 System.Net.Http 错误消息,显示在一个很小的、难以注意到但非常重要的 API 请求中我正在开发的网站。
我回滚到 4.6.1,一切又好了。
【讨论】:
【参考方案7】:您可以通过将项目升级到 .NET Framework 4.7.2 来解决此问题。这是answered by Alex Ghiondea - MSFT。请给他点赞,因为他是他应得的!
这在 .NET Framework 4.7.1 中被记录为一个已知问题。
作为一种解决方法,您可以将这些目标添加到您的项目中。他们将 从传递给的引用列表中删除 DesignFacadesToFilter SGEN(SGEN 完成后将它们添加回来)
<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies"> <ItemGroup> <DesignFacadesToFilter Include="System.IO.Compression.ZipFile" /> <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" /> <ReferencePath Remove="@(_FilterOutFromReferencePath)" /> </ItemGroup> <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target> <Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies"> <ItemGroup> <ReferencePath Include="@(_FilterOutFromReferencePath)" /> </ItemGroup> <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." /> </Target>
另一个选项(机器范围)是添加以下绑定重定向 到 sgen.exe.config:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> This will only work on machines with .NET Framework 4.7.1. installed. Once .NET Framework 4.7.2 is installed on that machine, this workaround should be removed.
【讨论】:
上面链接问题的这个答案现在是相关答案:***.com/a/52883065/54289 详情请参阅答案上的 cmets。【参考方案8】:更改以下内容:
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />
以下内容:
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0" />
在 web.config 中
【讨论】:
根本原因:coderjony.com/blogs/…【参考方案9】:这将适用于带有 Visual Studio 2017 (15.9.4) 的 .NET 4.7.2:
删除 web/app.config 绑定重定向 删除 System.Net.Http 的 NuGet 包 打开“添加新引用”并直接链接到 .NET 4.7.2 附带的新 4.2.0.0 构建【讨论】:
【参考方案10】:上面的绑定重定向对我不起作用,所以我在web.config
中注释掉了对System.Net.Http
的引用。没有它,一切似乎都可以正常工作。
<system.web>
<compilation debug="true" targetFramework="4.7.2">
<assemblies>
<!--<add assembly="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />-->
<add assembly="System.ComponentModel.Composition, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</assemblies>
</compilation>
<customErrors mode="Off" />
<httpRuntime targetFramework="4.7.2" />
</system.web>
【讨论】:
这适用于 Visual Studio 2017 (15.9.4) 并允许您使用 System.Net.Http (4.3.4) NuGet 包而不是直接引用随.NET 4.7.2 框架发布。要在 IDE 中使用随附的引用(不引入其他依赖项),请执行以下操作:1)删除 web/app.config 绑定重定向 2)删除 System.Net.Http 的 NuGet 包 3)打开“添加新引用”并直接链接到 .NET 4.7 附带的新 4.2.0.0 版本。 这在 VS2019 中对我有用,将应用程序从 4.6.1 迁移到 4.7.2 我有一个控制台应用程序项目,它作为网络作业工作。它在创建 SendGrid api 客户端时引发了该异常。从 app.config 中删除绑定重定向后,一切都开始工作了。谢谢你的建议,我从来没有想过。【参考方案11】:如果您的解决方案中有多个项目,请右键单击 Visual Studio 中的解决方案图标并选择“管理解决方案的 NuGet 包”,然后单击第四个选项卡“合并”以将所有项目合并到同一个DLL 的版本。这将为您提供要合并的引用程序集列表。单击列表中的每个项目,然后单击右侧显示的选项卡中的安装。
【讨论】:
将此与@sajeetharan 关于使用 AutoGenerateBindingRedirects 的回答结合起来,似乎旧版本的 VS 或 nuget 包可能会留下不正确的绑定语句。良好的清理工作会有很大帮助。【参考方案12】:按照以下步骤,
-
将 Visual Studio 更新到最新版本(很重要)
从
web.config
中删除所有绑定重定向
将此添加到 .csproj
文件中:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
构建项目
在bin
文件夹中应该有一个(WebAppName).dll.config
文件
它应该有重定向,将它们复制到web.config
从 .csproj
文件中删除上述内容
它应该可以工作
【讨论】:
现在我无法加载文件或程序集'Newtonsoft.Json,Version=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040) 你必须记得从生成的文件中复制绑定重定向,所以第一次你会得到上面的错误,但是去bin文件夹获取生成的(webappname).dll.config在上面,将整个重定向列表复制到您的 web.config 中,然后重新编译。这对我很有帮助,请确保您首先使用 nuget 合并工具清理尽可能多的引用。 太棒了。这实际上对我有用。 @EK_AllDay 您必须将 AssemblyRedirects 复制回原始 web.config。 ⭐☝ 传奇徽章当之无愧!附带说明一下,当我将 AssemblyRedirects 复制回 web.config 时,我看到 不再有 System.Net.Http 的绑定。所以我们假设VS现在使用的是.Net框架打包的默认程序集,而不是自己的版本? 将项目从 4.7.2 移动到 4.8 并得到错误。按照步骤操作,最终结果就是我的 web.config 中根本不需要 System.Net.Http 绑定。【参考方案13】:我有这个,但是,这是因为我添加了一个更新绑定重定向的 NuGet 包。一旦我删除了包,重定向仍然存在。我删除了所有这些,然后运行 update-package -reinstall。这添加了正确的重定向。
【讨论】:
【参考方案14】:检查 .net 框架版本。 我原来的 .net 框架是旧版本。 我安装了.net framework 4.6后,这个问题就自动解决了。
【讨论】:
【参考方案15】:在我的一个项目中,有一个具有更高版本 System.Net.Http 的 nuget 包。在我的启动项目中引用 System.Net.Http v 4.0.0 ,我刚刚在我的启动项目中安装了System.Net.Http nuget package 并解决了问题
【讨论】:
我在一个解决方案中有三个项目 - 我们称它们为A
、B
和 C
。 A
是启动项目,与B
或C
无关。 C
是 B
的测试项目。在C
中运行我的测试失败,因为我没有参考(System.Net.Http)项目A
有。【参考方案16】:
我有同样的问题,我能够解决它的唯一方法是将 bindingRedirect 添加到 app.confing 如何写 @tripletdad99。
但是如果你有更多项目的解决方案真的很糟糕手动更新每个项目(有时在更新一些 nuget 包之后你需要再做一次)。这就是我编写简单的 powershell 脚本的原因,如果所有 app.configs 的话。
param(
[string]$SourceDirectory,
[string]$Package,
[string]$OldVersion,
[string]$NewVersion
)
Write-Host "Start fixing app.config in $sourceDirectory"
Write-Host "$Package set oldVersion to $OldVersion and newVersion $NewVersion"
Write-Host "Search app.config files.."
[array]$files = get-childitem $sourceDirectory -Include app.config App.config -Recurse | select -expand FullName
foreach ($file in $files)
Write-Host $file
$xml = [xml](Get-Content $file)
$daNodes = $xml.configuration.runtime.assemblyBinding.dependentAssembly
foreach($node in $daNodes)
if($node.assemblyIdentity.name -eq $package)
$updateNode = $node.bindingRedirect
$updateNode.oldVersion = $OldVersion
$updateNode.newVersion =$NewVersion
Write-Host "Fix"
$xml.Save($file)
Write-Host "Done"
使用示例:
./scripts/FixAppConfig.ps1 -SourceDirectory "C:\project-folder" -Package "System.Net.Http" -OldVersion "0.0.0.0-4.3.2.0" -NewVersion "4.0.0.0"
可能它并不完美,如果有人将它链接到预构建任务会更好。
【讨论】:
以上是关于无法加载文件或程序集“System.Net.Http,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”的主要内容,如果未能解决你的问题,请参考以下文章
无法加载文件或程序集 'PayPalAdaptivePaymentsSDK,版本 = 2.12.117.0
无法加载文件或程序集。找到的程序集的清单定义与程序集引用不匹配
无法加载文件或程序集'netstandard,版本 = 2.0.0.0