#c# #.net #build #msbuild
#c# #.net #строить #msbuild
Вопрос:
Мне только что пришлось впервые выполнить некоторые сборки без использования Visual Studio, и, очевидно, в моих знаниях о MSBuild и процессе сборки есть пробел.
Итак, в чем различия между двумя приведенными ниже процессами сборки?
Вариант 1:
dotnet build C:DevtrunkMvc.sln
Этот параметр использует «Build Engine версии 16.8.3 39993bd9d для .NET» — я полагаю, это означает, что этот способ можно использовать для .NET Core, поскольку он не имеет ссылки на «Framework»?
Вариант 2:
msbuild C:DevtrunkMvc.sln
Этот параметр использует «Build Engine версии 16.8.2 25e4d540b для .NET Framework».
Мое предположение состояло в том, что команда «dotnet build» была просто сокращенным способом использования MSBuild. Однако ведение журнала, предоставляемое обоими, довольно сильно отличается, и оба они дают разные результаты.
Комментарии:
1. Тот же базовый компилятор, разные вещи, которые его вызывают. Сам компилятор нацелен на .NET Standard 2.0 и может работать как на .NET Framework, так и на .NET Core / 5. MSBuild (как и VS) работает на .NET Framework, в то время
dotnet build
как работает на .NET Core. Они по большому счету эквивалентны, хотя есть различия (например, анализаторы, которые нацелены. NET Core / 5 будет работать только подdotnet build
). MSBuild может обрабатывать проекты, отличные от SDK, тогдаdotnet build
как может обрабатывать только проекты в стиле SDK (помните, что сам компилятор не интерпретирует файлы .csproj)2. @canton7 спасибо за комментарий. Как это происходит при сборке в VS? Будет ли проект .NET Core использовать сборку dotnet, а проект .NET Framework использовать msbuild?
3. Нет, сборка в VS всегда будет запускать компилятор поверх .NET Framework: VS эффективно использует MSBuild. Целевая среда выполнения компилируемого приложения (технически) полностью независима от среды выполнения, в которой в данный момент выполняется сам компилятор: Roslyn, работающий на .NET Framework, может выдавать IL, который отлично выполняется .NET Core.
dotnet build
однако означает ли это, что компилятор может быть запущен на целевых объектах, которые не поддерживают .NET Framework (например, Linux), и в целом это гораздо более приятный интерфейс для использования в командной строке4. Хорошо, отлично, это имеет большой смысл. Спасибо, что нашли время объяснить это, чтобы помочь мне понять это, а не просто проголосовать против, потому что это просто!
5. Также стоит отметить, что компилятор поставляется с VS, поэтому его версии совпадают с версиями VS, и вы получаете новые версии компилятора, обновляя VS. Компилятор также включен в пакет SDK .NET и
dotnet build
загружает компилятор из одного из установленных пакетов SDK, поэтому вы можете обновить его, установив более поздний пакет SDK
Ответ №1:
Roslyn — платформа компилятора C # — это библиотека .NET Standard 2.0, что означает, что она может работать как на .NET Framework 4.6.1 , так и на .NET Core 2.0 (1).
Visual Studio, которая включает MSBuild, работает на платформе .NET Framework. Когда вы создаете проект с помощью Visual Studio (или непосредственно с помощью MSBuild), он запускает Roslyn на .NET Framework. Visual Studio знает, как обрабатывать как csprojs в стиле SDK, так и устаревшие csprojs в стиле, отличном от SDK, и соответственно вызывать Roslyn. Используемая версия Roslyn привязана к версии Visual Studio.
dotnet build
это отдельный инструмент и приложение .NET Core. Он знает, как создавать только csprojs в стиле SDK, и делает это, запустив Roslyn на .NET Core. Roslyn распространяется вместе с пакетами SDK .NET Core и dotnet build
загружает Roslyn из одной из этих установленных версий SDK (обычно последней).
Эти два способа построения проекта на C # более или менее эквивалентны, и они вызывают один и тот же код компилятора. Однако они различаются в зависимости от того, где они могут запускаться (Visual Studio — это .NET Framework и только для Windows, dotnet build
является .NET Core и может работать на нескольких платформах), и могут ли они создавать устаревшие csproj в стиле, отличном от SDK. dotnet build
также немного приятнее использовать из командной строки.
Обратите внимание, что среда выполнения, в которую загружен Roslyn, не имеет никакого отношения к скомпилированному IL, который может выдавать Roslyn: Roslyn, работающий на .NET Framework, может выдавать IL, который отлично выполняется .NET Core, и наоборот.
Если вы используете анализаторы , которые нацелены .СЕТЕВОЕ ядро (маловероятно, так как анализаторам рекомендуется выбирать таргетинг.NET Standard 2.0), они будут запускаться только с dotnet build
.
(1) Я использую «.NET Core» для обозначения как .NET Core, так и .NET 5 .