Microsoft.Net.Http.Headers 程序集版本 2.2.0 与 6.0.0 的分辨率取决于看似不相关的包引用

问题描述 投票:0回答:1

在尝试使用 HeaderNames.XFrameOptions 时,我发现它在我的一个项目中有效,但在另一个项目中失败。两者都针对 .NET 6。

在我的应用程序中,我需要使用 X-Frame-Options HTTP 标头。如果可能,出于可维护性的原因,我尝试避免自己为此类标准字符串指定常量,而是依赖标准常量。对于此标头的名称,有 HeaderNames.XFrameOptions,自 ASP.NET Core 3.0 起可用。

通过在 VS 中导航到该类的实现,我发现它所在的项目使用 Microsoft.Net.Http.Headers 程序集的版本 6.0.0.0(.NET 6,x64):

C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App .0.12\Microsoft.Net.Http.Headers.dll

它不起作用的项目使用版本2.2.0.0(.NET Standard 2.0,MSIL)的程序集:

C:\ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.net.http.headers .2.0 \ lib etstandard2.0\Microsoft.Net.Http.Headers.dll

工作项目是我的控制台应用程序的主项目,损坏的项目是同一解决方案中的库,由控制台应用程序直接引用。

当我查看损坏的项目的 obj\project.assets.json 时,我发现 Microsoft.Net.Http.Headers 确实在 2.2.0 版本中使用,并且它被 Microsoft.AspNetCore.Http.Extensions/2.2 引用。 0,这也用在破碎的项目中。

我使用该信息重现了失败:

dotnet new globaljson --sdk-version 6.0.404 --roll-forward disable dotnet new console -f net6.0 dotnet add package Microsoft.AspNetCore.Http.Extensions --version 2.2.0 echo "Console.WriteLine(Microsoft.Net.Http.Headers.HeaderNames.XFrameOptions);" > Program.cs dotnet run

C:\Repos\playground\Program.cs(1,58):错误 CS0117:“HeaderNames”不包含“XFrameOptions”的定义 [C:\Repos\playground\playground.csproj]

构建失败。修复构建错误并再次运行。

我尝试将工作项目引用的所有包添加到重现项目中,它修复了它!通过消除并遵循最后一个剩余项目的依赖关系,我发现只需添加一个包即可实现修复(

AspNetCore.HealthChecks.UI.Client/6.0.5):

dotnet add package AspNetCore.HealthChecks.UI.Client --version 6.0.5 dotnet run

X 框架选项

我看到 AspNetCore.HealthChecks.UI.Client 引用了 Microsoft.Net.Http.Headers 程序集版本 6.0.0.0,但直接引用为程序集,而不是 NuGet 包。遗憾的是,最新的打包版本是2.2.0.0。

如何使 HeaderNames.XFrameOptions 同时在我的两个项目中工作? 安装像 AspNetCore.HealthChecks.UI.Client 这样不相关的包是唯一的解决方案吗?有没有更直接的方法来诊断此类程序集解析问题?

asp.net-core .net-core .net-assembly .net-standard assembly-resolution
1个回答
0
投票
在 ASP.NET Core 2.2 和 3.0 之间,分发模型发生了变化。从.NET Core 3.0和ASP.NET Core 3.0开始,框架本身的单独包不再发布,应该使用

Microsoft.AspNetCore.App共享框架来代替。

Microsoft.NET.Sdk.Web SDK 隐式引用共享框架。要在类库中以及更一般地在使用不同 SDK 的项目中引用共享框架,请使用 FrameworkReference:

<ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup>
这是

类库中 ASP.NET Core 使用指南推荐的。当决定是否保留与古老的 ASP.NET Core 2.2 及更早版本的兼容性或是否使用新的 API 时,还有另一个指南。

从 ASP.NET Core 2.2 或更早版本迁移到较新版本时,请遵循从 2.2 迁移到 3.0 的指南:

删除对旧库的引用并在适当的情况下使用FrameworkReference

虽然已经使用较新的 ASP.NET Core,但请注意不要添加对 ASP.NET Core 2.2 的 NuGet 包的引用。

奇怪的是,旧包没有标记为已弃用。

更多阅读框架参考:

密切相关的问题:

  • 如何在.NET 6库中引用ASP.NET Core 6类型?
  • ASP.NET Core 3:如何在自定义库中引用3.0.0程序集?
© www.soinside.com 2019 - 2024. All rights reserved.