无法加载文件或程序集。Http,版本=4.0.0.0,文化=中立,PublicKeyToken=b03f5f7f11d50a3a"

我已经将我的项目复制到一台干净的Windows 10机器上,只安装了Visual Studio 2015 Community和SQL Server 2016 Express。除了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程序集\Microsoft\ framework.net框架\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为目标,还是有其他方法来引用正确的程序集?

233976 次浏览

更改我的网页中的绑定信息。Config(或app.config) -而"hack"在我看来,允许你在NuGet包更新打击你的应用程序并给你System.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>

我有同样的问题,唯一的方法,我如何能够修复它是添加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更高版本的nuget包。在我的启动项目中引用System.Net.Http v 4.0.0,我刚刚在我的启动项目中安装了System.Net.Http nuget包,问题解决了

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

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

请遵循以下步骤:

  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文件中删除上述片段

它应该会起作用。

如果您的解决方案中有多个项目,那么右键单击Visual Studio中的解决方案图标并选择“管理解决方案的NuGet包”,然后单击第四个选项卡“合并”,将所有项目合并到相同版本的dll中。这将为您提供一个要合并的引用程序集列表。单击列表中的每个项目,然后单击右侧选项卡中的install。

上面的绑定-重定向对我不起作用,所以我在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>

你可以通过将项目升级到. net Framework 4.7.2来解决这个问题。这是回答:Alex gihiondea -微软。请给他投票,因为他真的值得!

在. 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: < / p >
<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.

这将在。net 4.7.2和Visual Studio 2017(15.9.4)中工作:

  • 删除web /应用程序。配置绑定重定向
  • 删除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) < / >

变更后:

<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

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

一切都正常工作,没有错误,发布也没有问题,只是由于偶然的机会,我遇到了System.Net.Http错误消息,它显示在我正在工作的网站上的一个很小的,很难注意到的,但非常重要的API请求中。

我回滚到4.6.1,一切恢复正常。

对我来说,唯一干净利落地解决这个问题的方法。NET 4.6.1)不仅为实际使用System.Net的项目添加了对System.Net.Http V4.3.4的Nuget引用。Http,但也启动项目(在我的情况下是一个测试项目)。

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

4.6.1-2在VS2017中,用户可能会遇到他们的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引用的版本构建项目。

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

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

然后我用nuget更新了大量的“包”,并得到了错误消息,然后注意到一些东西将引用重置为2.0.0.0,所以我删除并重新添加,它工作正常…怪异。

对我来说,我又加了一块鸡块,问题就解决了

remove dependentAssembly for name=" system.net.httpquot;从网络。Config对我也有用。我从网上评论了这部分。配置,它为我工作。 如果以上所有解决方案都不奏效,请尝试如下所示的注释或删除

<!--<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0"/>
</dependentAssembly>-->

在做一些技巧和复杂的配置之前,尝试删除bin和obj文件夹,然后进行编译。解决了同样的问题

  1. < p >开放网络。运行时>包括里面的所有东西

    & lt; * * runtime> & lt; assemblyBinding xmlns =“urn: schemas-microsoft-com: asm.v1"比;& lt; /运行时>

  2. 保存并关闭Web.config

  3. 打开“Package Manager Console”,执行命令

    Add-BindingRedirect

当我的团队成员从。net Framework 4.6.1升级到。net Framework 4.8,从VS 2017升级到VS 2022时,这解决了我的问题