<FrameworkReference Include="Microsoft.AspNetCore.App" /> 在 .net core 3+ 中实际上做了什么?

Яро*_*вич 4 c# asp.net-core asp.net-core-3.1

最近,我阅读了有关使用 ASP.NET Core 共享框架的文章,我想知道:

  1. 它是如何在引擎盖下工作的?
  2. 添加时我应该考虑任何缺点或注意事项<FrameworkReference Include="Microsoft.AspNetCore.App" />吗?

例如,我创建了一个简单的控制台应用程序并发布了它的self-hosted选项。<FrameworkReference Include="Microsoft.AspNetCore.App" /即使我没有明确使用任何Microsoft.AspNetCore软件包,输出大小也要大20mb

pok*_*oke 7

共享框架是包含在运行时中的程序集集合,因此不需要通过 NuGet 单独解析。不过,您可以将其视为 NuGet 包,因为处理方式非常相似。当然,主要区别在于它不需要从 NuGet 下载,因为它可以在本地随运行时一起使用。

由于它与运行时一起分发,这也意味着您不能引用它的特定版本。相反,您始终会获得包含在可用运行时版本中的版本。这样做的好处是内容将在运行时更新时自动更新,因此依赖于共享框架之一的应用程序也将在运行时前滚。

  1. 试图详细回答这个问题超出了 Stack Overflow 答案的范围,因为这是一些深层的 MSBuild 逻辑。如果您有兴趣了解,可以查看dotnet/sdk 存储库,其中包含使Microsoft.NET.Sdk项目 SDK 及其子类型正常工作的所有内容,包括FrameworkReference实现。

  2. 首先,您应该知道,如果不使用该框架参考,就无法使用例如 ASP.NET Core。所以你的选择并不多。大多数情况下,您不会自己添加框架引用;ASP.NET Core 应用程序Microsoft.NET.Sdk.Web默认使用已包含框架参考的项目 SDK。如果要在非 Web 项目中(例如在 ASP.NET Core 的类库中)添加 ASP.NET Core 引用,则只需自己添加框架引用。

    除此之外,你需要记住的事情并不多。请记住不要使用某个版本并保持您的 SDK 和运行时更新,以确保您拥有所有最新的安全补丁。

  • @ErikHart是的,`PackageReference`引用了一个有版本的NuGet包;“FrameworkReference”引用 .NET 附带的框架的一部分。因此它不能有版本,因为它将始终使用运行时附带的版本。[`Microsoft.AspNetCore.App` NuGet 包](https://www.nuget.org/packages/Microsoft.AspNetCore.App/) 是在框架引用出现之前的旧时代,现在仅用于在旧版 .NET Framework 上运行 ASP.NET Core(因为 ASP.NET Core 2.1(不是 2.2)仍然受支持)。 (2认同)