【发布时间】:2019-08-04 12:26:40
【问题描述】:
我试图在 .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(希望解决对 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和我设置的一样,但还添加了一个元包:<PackageReference Include="Microsoft.AspNetCore.App" />
如果我们已经指定要使用 Microsoft.NET.Sdk.Web,为什么还需要显式添加元包?
另外一个问题:如果我们没有在 PackageReference 中指定一个元包版本(比如在这个生成的 webapi .csproj 中),那么使用什么版本的元包?
【问题讨论】:
标签: c# asp.net-web-api asp.net-core .net-core nuget