我试图在.NET Core术语中区分这两个概念。我将尝试通过一个例子来说明我的困惑。
当我创建一个新的类库项目(例如:dotnet new classlib -o myclasslib
)时,生成的.csproj
文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
到目前为止,一切都很好。现在,如果我尝试在此项目中添加WebApi控制器类(例如,以动态方式在创建为dotnet new webapi -o mywebapi
的主WebApi应用程序中加载插件的目的),则需要使用类似ControllerBase类的东西以及[ApiController]
和[HttpGet]
属性。为了简单起见,我只需要像下面这样从ControllerBase派生MyController:
using System;
namespace myclasslib
{
public class MyController : Microsoft.AspNetCore.Mvc.ControllerBase
{
}
}
尝试使用dotnet build
进行构建时出现错误:
错误CS0234:类型或名称空间名称'AspNetCore'不存在 在名称空间“ Microsoft”中(您是否缺少程序集引用?)
这是预料之中的,因为我创建了classlib项目,但是如果将.csproj中的SDK更改为Sdk="Microsoft.NET.Sdk.Web"
,并且还将TargetFramework
更改为netcoreapp2.2
(希望将对{{3 }}类):
<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相同,但是还添加了一个metapackage:<PackageReference Include="Microsoft.AspNetCore.App" />
那么,如果我们已经指定要使用Microsoft.NET.Sdk,为什么我们需要显式添加metapackage。 Web ?
另一个问题:如果未在PackageReference中指定一个版本的metapackage(例如在此生成的webapi .csproj中)?
答案 0 :(得分:1)
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软件包。