无法加载文件或程序集“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.Httpbin 文件夹中找不到该文件。

文件的路径指向:

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 并解决了问题

【讨论】:

我在一个解决方案中有三个项目 - 我们称它们为 ABCA 是启动项目,与BC 无关。 CB 的测试项目。在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

无法加载文件或程序集 此处的程序集名称 或其依赖项之一。访问被拒绝

无法加载文件或程序集或其依赖项之一

寻找解决策略:无法加载文件或程序集[重复]