为了账号安全,请及时绑定邮箱和手机立即绑定

.NET Core 2.2 中的 Metapackage 和 SDK 有什么区别?

.NET Core 2.2 中的 Metapackage 和 SDK 有什么区别?

C#
牛魔王的故事 2022-10-23 13:54:51
我试图在 .NET Core 术语中区分这两个概念。我将尝试用一个例子来说明我的困惑。当我创建一个新的类库项目(例如:)dotnet new classlib -o myclasslib时,生成的.csproj文件如下所示:<Project Sdk="Microsoft.NET.Sdk">  <PropertyGroup>    <TargetFramework>netstandard2.0</TargetFramework>  </PropertyGroup></Project>到目前为止,一切都很好。现在,如果我尝试在这个项目中添加 WebApi 控制器类(例如,为了在创建为: 的主 WebApi 应用程序中动态加载插件dotnet new webapi -o mywebapi),我将需要使用ControllerBase类[ApiController]和[HttpGet]属性之类的东西。为了简单起见,我只是从 ControllerBase 派生 MyController ,如下所示:using System;namespace myclasslib{    public class MyController : Microsoft.AspNetCore.Mvc.ControllerBase    {    }}试图用dotnet build我来构建这个错误:错误 CS0234:命名空间“Microsoft”中不存在类型或命名空间名称“AspNetCore”(您是否缺少程序集引用?)这是意料之中的,因为我创建了 classlib 项目,但是如果将 .csproj 中的 SDK 更改为Sdk="Microsoft.NET.Sdk.Web"并更改TargetFramework为netcoreapp2.2(希望解决对ControllerBase类的引用),如下所示:<Project Sdk="Microsoft.NET.Sdk.Web">  <PropertyGroup>    <TargetFramework>netcoreapp2.2</TargetFramework>  </PropertyGroup></Project>构建项目时出现同样的错误。SDK不应该包含我构建项目所需的一切吗?如果我创建通常的 webapi 项目(例如dotnet new webapi -o mywebapi),生成的.csproj看起来像这样:<Project Sdk="Microsoft.NET.Sdk.Web">  <PropertyGroup>    <TargetFramework>netcoreapp2.2</TargetFramework>    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>  </PropertyGroup>  <ItemGroup>    <PackageReference Include="Microsoft.AspNetCore.App" />    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />  </ItemGroup></Project>我注意到 SDK 与我设置的 SDK 相同,但还添加了一个元包:<PackageReference Include="Microsoft.AspNetCore.App" />那么,如果我们已经指定要使用 Microsoft.NET.Sdk,为什么还需要显式添加元包。网络?另一个问题:如果我们没有在 PackageReference 中指定一个元包版本(比如在这个生成的 webapi .csproj 中),那么使用什么版本的元包?
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

SDK 只是构建工具和 .NET Core 框架本身。ASP.NET Core 是一组 NuGet 包。本质上是 .NET Core 框架!= ASP.NET Core 代码。元包的概念只是切线相关的。所谓的“ASP.NET Core”实际上是几十个单独的 NuGet 包。您可以单独引用每个,但正如您可以想象的那样,这既烦人又容易出错。元包本质上是一个依赖于多个其他 NuGet 包的 NuGet 包。

因此,通过仅拉入元包,基本上所有元包的依赖项都被拉入。因此,您可以简单地添加一个包引用,Microsoft.AspNetCore.App然后您就可以参加比赛了。但是,这样做的缺点是您可能会获得实际上不需要的依赖项。对于像 Web 应用程序这样的东西来说,这并不是什么大问题,因为可以修剪依赖关系,但类库不应该有过多的依赖关系。因此,您应该只从Microsoft.AspNetCore命名空间中引用您实际需要的单个 NuGet 包。


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信