Tuve que hacer algunas compilaciones sin usar Visual Studio por primera vez, y claramente hay una brecha en mi conocimiento sobre MsBuild y el proceso de compilación.
Entonces, ¿cuáles son las diferencias entre los dos procesos de compilación a continuación?
Opción 1:
dotnet build C:\Dev\trunk\Mvc.slnEsta opción usa "Build Engine versión 16.8.3+39993bd9d para .NET". Supongo que esto significa que de esta manera se puede usar para .NET Core, ya que no hace referencia a "Framework".
Opcion 2:
msbuild C:\Dev\trunk\Mvc.slnEsta opción usa "Build Engine versión 16.8.2+25e4d540b para .NET Framework".
Supuse que el comando "dotnet build" era solo una forma abreviada de usar MsBuild. Sin embargo, el registro proporcionado por ambos es bastante diferente y ambos producen resultados diferentes.
Roslyn, la plataforma de compilación de C#, es una biblioteca .NET Standard 2.0, lo que significa que puede ejecutarse tanto en .NET Framework 4.6.1+ como en .NET Core 2.0+ (1) .
Visual Studio, que incluye MSBuild, se ejecuta en .NET Framework. Cuando crea un proyecto con Visual Studio (o directamente con MSBuild), ejecuta Roslyn en .NET Framework. Visual Studio sabe cómo procesar csprojs de estilo SDK y csprojs heredados que no son de estilo SDK e invocar a Roslyn en consecuencia. La versión de Roslyn que se usa está vinculada a la versión de Visual Studio.
dotnet build es una herramienta separada y es una aplicación .NET Core. Solo sabe cómo compilar csprojs de estilo SDK y lo hace ejecutando Roslyn en .NET Core. Roslyn se distribuye con los SDK de .NET Core y dotnet build carga a Roslyn desde una de estas versiones de SDK instaladas (normalmente la última).
Estas dos formas de crear un proyecto de C# son más o menos equivalentes e invocan el mismo código de compilación. Sin embargo, difieren en cuanto a dónde pueden ejecutarse (Visual Studio es .NET Framework y solo para Windows, dotnet build es .NET Core y puede ejecutarse en varias plataformas) y si pueden compilar csprojs heredados que no sean de estilo SDK. dotnet build también es un poco más agradable de usar desde la línea de comandos.
Tenga en cuenta que el tiempo de ejecución en el que se carga Roslyn no tiene relación con la IL compilada que Roslyn puede emitir: Roslyn que se ejecuta en .NET Framework puede emitir IL que ejecuta .NET Core sin problemas, y viceversa.
Si está utilizando analizadores que apuntan a .NET Core (poco probable, ya que se recomienda que los analizadores apunten a .NET Standard 2.0), estos solo se ejecutarán desde dotnet build .
(1) Estoy usando ".NET Core" para referirme tanto a .NET Core como a .NET 5+.