使用 dotnet 和 MsBuild 构建 .NET 应用程序有什么区别?

Mur*_*ro2 3 .net c# msbuild build

我第一次只需要在不使用 Visual Studio 的情况下进行一些构建,显然我对 MsBuild 和构建过程的了解存在差距。

那么,下面这两个构建过程有什么区别呢?


选项1:

dotnet build C:\Dev\trunk\Mvc.sln
Run Code Online (Sandbox Code Playgroud)

此选项使用“用于 .NET 的构建引擎版本 16.8.3+39993bd9d”——我认为这意味着这种方式可用于 .NET Core,因为它没有引用“框架”?


选项 2:

msbuild C:\Dev\trunk\Mvc.sln
Run Code Online (Sandbox Code Playgroud)

此选项使用“Build Engine version 16.8.2+25e4d540b for .NET Framework”。


我的假设是“dotnet build”命令只是使用 MsBuild 的一种速记方式。但是,两者提供的日志记录非常不同,它们都会产生不同的结果。

can*_*on7 9

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+。


Nei*_*its 8

MSBuild 代表“Microsoft Build Engine”,它是一个用于构建应用程序的平台。在带有 .NET Core 的独立于平台的 .NET 出现之前,MSBuild 是一款仅限 Windows 的工具,并且只能作为 Visual Studio 许可证的一部分获得。

随着 .NET Core 的出现,可以通过安装 .NET SDK 来获取 MSBuild,它不受 Visual Studio 的约束,且与平台无关。通过 CLI 使用 .NET SDK 时,运行dotnet build相当于dotnet msbuild --restore. 在底层,后一个命令也运行 MSBuild,但在本例中是 .NET SDK 附带的命令。

据我所知,msbuild只能在安装了 Visual Studio 的 Windows 上运行 CLI 命令(尚未在安装了 VS for Mac 的 Mac 上尝试过)。但是,此命令等效于dotnet msbuild在具有 .NET SDK 的系统上运行。因此,在某种程度上,您提到的两个命令本质上是相同的,除了dotnet build在运行之前静默调用恢复项目dotnet msbuild(如上所述,这相当于msbuild在 Windows 上使用 Visual Studio)。