【问题标题】:Could not load file or assembly "System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"无法加载文件或程序集“System.Net.Http,版本=4.0.0.0,文化=中性,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 为目标还是有其他方法可以引用正确的程序集?

【问题讨论】:

标签: c# azure visual-studio-2015


【解决方案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.
          

          【讨论】:

          【解决方案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 中

          【讨论】:

          【解决方案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】:

            按照以下步骤,

            1. 将 Visual Studio 更新到最新版本(很重要)
            2. web.config 中删除所有绑定重定向
            3. 将此添加到 .csproj 文件中:

              <PropertyGroup>
                <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
                <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
              </PropertyGroup>
              
            4. 构建项目
            5. bin 文件夹中应该有一个(WebAppName).dll.config 文件
            6. 它应该有重定向,将它们复制到web.config
            7. .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"
                

                可能它并不完美,如果有人将它链接到预构建任务会更好。

                【讨论】:

                  猜你喜欢
                  • 2018-02-05
                  • 2021-12-17
                  • 1970-01-01
                  • 2017-03-07
                  • 2021-01-22
                  • 2018-06-27
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多