无法加载文件或程序集" System.Net.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"

时间:2016-07-16 05:43:56

标签: c# visual-studio-2015

我已将我的项目复制到只安装了Visual Studio 2015社区和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:\发展\ MyApp的\包\ Microsoft.AspNet.WebApi.Client.5.2.3 \ lib中\ net45 \ System.Net.Http.Formatting.dll

整个项目是否应该以4.5.1为目标,还是有其他方式来引用正确的程序集?

16 个答案:

答案 0 :(得分:189)

更改我的web.config(或app.config)中的绑定信息 - 而#34; hack&#34;在我看来,允许您在NuGet包更新破坏您的应用程序后向前推进您的项目,并为您提供System.Net.Http错误。

设置newVersion =&#34; 4.0.0.0&#34;

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

答案 1 :(得分:47)

按照以下步骤

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

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
    
  5. 构建项目
  6. bin文件夹中应该有一个(WebAppName).dll.config文件
  7. 它应该有重定向,将这些重定向到web.config
  8. .csproj 文件
  9. 中删除上述剪辑

    应该有效

答案 2 :(得分:24)

在我的一个项目中,有一个带有更高版本System.Net.Http的nuget软件包。在我的启动项目中引用了System.Net.Http v 4.0.0,我刚刚在我的启动项目中安装了System.Net.Http nuget package并解决了问题

答案 3 :(得分:8)

如果您的解决方案中有多个项目,请右键单击Visual Studio中的解决方案图标,然后选择“管理解决方案的NuGet包”,然后单击第四个选项卡&#39;合并&#39 39;将所有项目合并到相同版本的DLL。这将为您提供要合并的引用程序集列表。单击列表中的每个项目,然后在右侧显示的选项卡中单击“安装”。

答案 4 :(得分:6)

上面的bind-redirect对我不起作用,因此我注释掉了System.Net.Http中对web.config的引用。没有它,一切似乎都可以正常工作。

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

答案 5 :(得分:5)

您可以通过将项目升级到.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.

答案 6 :(得分:4)

我有同样的问题,只有我能够修复它的方法是将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"

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

答案 7 :(得分:4)

更改以下内容:

<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中

答案 8 :(得分:2)

这将在带有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版本。

![image](https://user-images.githubusercontent.com/38843378/50998531-b5bb3a00-14f5-11e9-92df-6c590c469349.png)

答案 9 :(得分:1)

我有这个,但是,这是因为我添加了一个更新了绑定重定向的NuGet包。一旦我删除了包,重定向仍然存在。我删除了所有这些,然后运行update-package -reinstall。这增加了正确的重定向。

答案 10 :(得分:0)

检查.net框架版本。
我原来的.net框架是旧版本 安装.net framework 4.6后,这个问题会自动解决。

答案 11 :(得分:0)

对我来说,我已将项目设置为在最新版本的.Net Framework上运行(从.Net Framework 4.6.1更改为4.7.2)。

一切正常,没有错误,并且发布没有问题,这只是偶然的机会,我偶然遇到了System.Net.Http错误消息,该消息显示在一个很小的,难以通知但非常重要的API请求上我正在工作的网站。

我回滚到4.6.1,一切都很好。

答案 12 :(得分:0)

为我彻底解决此问题(.NET 4.6.1)的唯一方法是,不仅为实际使用System.Net.Http的项目添加对System.Net.Http V4.3.4的Nuget引用,而且还要进入启动项目(在我的情况下是测试项目)。

(这很奇怪,因为正确的System.Net.Http.dll存在于测试项目的bin目录中,并且.config assemblyBingings也看起来还可以。)

答案 13 :(得分:0)

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引用的版本进行构建。

答案 14 :(得分:0)

正在使用nuget(包括.Net更新和MVC更新)更新旧网站。

我在VS2017中删除了System.Net.HTTP引用(版本为2.0.0.0),然后重新添加了引用,然后显示了4.2.0.0。

然后我使用nuget更新了很多“包”并得到了错误消息,然后发现某些内容将引用重置为2.0.0.0,因此我再次删除并重新添加了它,效果很好...很奇怪。 / p>

答案 15 :(得分:0)

对我来说,我再次添加了nuget,问题解决了