Я пытаюсь провести различие между этими двумя понятиями в терминологии .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 class и [ApiController]
и [HttpGet]
атрибуты. Для простоты я просто извлекаю MyController из ControllerBase следующим образом:
using System;
namespace myclasslib
{
public class MyController : Microsoft.AspNetCore.Mvc.ControllerBase
{
}
}
Попытка построить это с dotnet build
Я получаю ошибку:
ошибка CS0234: тип или имя пространства имен AspNetCore не существует
в пространстве имен «Microsoft» (отсутствует ссылка на сборку?)
Такого рода ожидалось, потому что я создал проект classlib, но если изменить SDK в .csproj на Sdk="Microsoft.NET.Sdk.Web"
, а также изменить TargetFramework
на netcoreapp2.2
(в надежде разрешить ссылку на ControllerBase class) как это:
<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)?