我已将我的项目复制到只安装了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.Http
在bin
文件夹中找不到该文件。
该文件的路径指向:
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为目标,还是有其他方式来引用正确的程序集?
答案 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)
按照以下步骤
web.config
将此添加到 .csproj
文件:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
bin
文件夹中应该有一个(WebAppName).dll.config
文件web.config
.csproj
文件应该有效
答案 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中工作:
答案 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)
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,问题解决了