我已将我的项目复制到仅安装了 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.Http
在 bin
文件夹中找不到该文件。
该文件的路径指向:
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 为目标还是有其他方法可以引用正确的程序集?
update-package xxx -reinstall
。它也不起作用。
更改我的 web.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>
请按照以下步骤操作:
将 Visual Studio 更新到最新版本(这很重要) 从 web.config 中删除所有绑定重定向 将此添加到 .csproj 文件中:
它应该工作。
在我的一个项目中,有一个具有更高版本 System.Net.Http 的 nuget 包。在我的启动项目中引用 System.Net.Http v 4.0.0 ,我刚刚在我的启动项目中安装了 System.Net.Http nuget package 并且问题解决了
A
、B
和 C
。 A
是启动项目,与 B
或 C
无关。 C
是 B
的测试项目。在 C
中运行我的测试失败,因为我没有参考 (System.Net.Http) 项目 A
。
更改以下内容:
<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 中
上面的绑定重定向对我不起作用,所以我在 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 中的解决方案图标并选择“管理解决方案的 NuGet 包”,然后单击第四个选项卡“合并”以将所有项目合并到相同版本的DLL。这将为您提供要合并的引用程序集列表。单击列表中的每个项目,然后单击右侧显示的选项卡中的安装。
这将适用于带有 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 构建
https://i.stack.imgur.com/XAoSa.png
您可以通过将项目升级到 .NET Framework 4.7.2 来解决此问题。这是answered by Alex Ghiondea - MSFT。请给他点赞,因为他真的应得的!
这被记录为 .NET Framework 4.7.1 中的一个已知问题。作为一种解决方法,您可以将这些目标添加到您的项目中。他们将从传递给 SGEN 的引用列表中删除 DesignFacadesToFilter(并在 SGEN 完成后将它们添加回来)
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 引用的版本构建项目。
我有同样的问题,我能够解决它的唯一方法是将 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"
可能它并不完美,如果有人将它链接到预构建任务会更好。
我有这个,但是,这是因为我添加了一个更新绑定重定向的 NuGet 包。一旦我删除了包,重定向仍然存在。我删除了所有这些,然后运行 update-package -reinstall。这添加了正确的重定向。
在进行技巧和配置复杂性之前,请尝试删除 bin 和 obj 文件夹,然后编译。解决了同样的问题
检查 .net 框架版本。我原来的 .net 框架是旧版本。安装 .net framework 4.6 后,这个问题就自动解决了。
对我来说,我已将我的项目设置为在最新版本的 .Net Framework 上运行(从 .Net Framework 4.6.1 更改为 4.7.2)。
一切正常,没有错误,发布也没有问题,我偶然发现 System.Net.Http 错误消息,显示在网站上的一个很小的、难以注意到但非常重要的 API 请求中米工作。
我回滚到 4.6.1,一切又好了。
为我 (.NET 4.6.1) 彻底解决此问题的唯一方法是不仅为实际使用 System.Net.Http 的项目添加对 System.Net.Http V4.3.4 的 Nuget 引用,而且还添加到启动项目(在我的例子中是一个测试项目)。
(这很奇怪,因为正确的 System.Net.Http.dll 存在于测试项目的 bin 目录中,并且 .config assemblyBingings 看起来也不错。)
正在使用 nuget 更新旧网站(包括 .Net 更新和 MVC 更新)。
我删除了 VS2017 中的 System.Net.HTTP 引用(它是版本 2.0.0.0)并重新添加了引用,然后显示 4.2.0.0。
然后我使用 nuget 更新了大量的“包”并收到错误消息,然后注意到某些东西已将引用重置为 2.0.0.0,所以我删除并再次重新添加它工作正常......奇怪。
对我来说,我再次添加了nuget,问题就解决了
从 web.config 中删除 name="System.Net.Http" 的dependentAssembly 也对我有用。我从 web.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>-->
打开 Web.config 并删除
当我的团队成员从 .NET Framework 4.6.1 升级到 .NET Framework 4.8 和 VS 2017 到 VS 2022 时,这解决了我的问题