使用dotnet和MsBuild构建.NET应用程序有什么区别?
c#
我第一次只需要在不使用 Visual Studio 的情况下进行一些构建,显然我对 MsBuild 和构建过程的了解存在差距。
那么,下面这两个构建过程有什么区别呢?
选项1:
dotnet build C:DevtrunkMvc.sln
此选项使用“用于 .NET 的构建引擎版本 16.8.3+39993bd9d”——我认为这意味着这种方式可用于 .NET Core,因为它没有引用“框架”?
选项 2:
msbuild C:DevtrunkMvc.sln
此选项使用“Build Engine version 16.8.2+25e4d540b for .NET Framework”。
我的假设是“dotnet build”命令只是使用 MsBuild 的一种速记方式。但是,两者提供的日志记录非常不同,它们都会产生不同的结果。
回答
Roslyn - C# 编译器平台 - 是一个 .NET Standard 2.0 库,这意味着它可以在 .NET Framework 4.6.1+ 和 .NET Core 2.0+ (1) 上运行。
包含 MSBuild 的 Visual Studio 在 .NET Framework 上运行。当您使用 Visual Studio(或直接使用 MSBuild)构建项目时,它会在 .NET Framework 上运行 Roslyn。Visual Studio 知道如何处理 SDK 样式的 csprojs 和旧的非 SDK 样式的 csprojs,并相应地调用 Roslyn。使用的 Roslyn 版本与 Visual Studio 版本相关联。
dotnet build是一个单独的工具,是一个 .NET Core 应用程序。它只知道如何构建 SDK 风格的 csprojs,它通过在 .NET Core 上运行 Roslyn 来实现。Roslyn 随 .NET Core SDK 一起分发,并dotnet build从这些已安装的 SDK 版本之一(通常是最新版本)加载 Roslyn。
这两种构建 C# 项目的方法或多或少是等效的,它们调用相同的编译器代码。但是,它们的运行位置不同(Visual Studio 是 .NET Framework 和仅适用于 Windows,dotnet build是 .NET Core 并且可以在多个平台上运行),以及它们是否可以构建旧的非 SDK 样式的 csprojs。dotnet build从命令行使用也更好一些。
请注意,Roslyn 加载到的运行时与 Roslyn 可以发出的已编译 IL 无关:在 .NET Framework 上运行的 Roslyn 可以发出由 .NET Core 执行的 IL。
如果您正在使用面向 .NET Core 的分析器(不太可能,因为我们鼓励分析器面向 .NET Standard 2.0),它们将仅从dotnet build.
(1)我使用“.NET Core”来指代 .NET Core 和 .NET 5+。