C# 什么';使用dotnet和MsBuild构建.NET应用程序之间的区别是什么?
我第一次不得不在不使用VisualStudio的情况下进行一些构建,很明显,我对MsBuild和构建过程的了解存在差距 那么,下面两个构建过程之间的区别是什么C# 什么';使用dotnet和MsBuild构建.NET应用程序之间的区别是什么?,c#,.net,build,msbuild,C#,.net,Build,Msbuild,我第一次不得不在不使用VisualStudio的情况下进行一些构建,很明显,我对MsBuild和构建过程的了解存在差距 那么,下面两个构建过程之间的区别是什么 备选案文1: dotnet build C:\Dev\trunk\Mvc.sln 此选项使用“Build Engine version 16.8.3+39993bd9d for.NET”-我想这意味着这种方式可以用于.NET核心,因为它没有“Framework”的引用 备选案文2: msbuild C:\Dev\trunk\Mvc.
备选案文1:
dotnet build C:\Dev\trunk\Mvc.sln
此选项使用“Build Engine version 16.8.3+39993bd9d for.NET”-我想这意味着这种方式可以用于.NET核心,因为它没有“Framework”的引用
备选案文2:
msbuild C:\Dev\trunk\Mvc.sln
此选项使用“针对.NET Framework的生成引擎版本16.8.2+25e4d540b”
我的假设是“dotnetbuild”命令只是使用MsBuild的一种简写方式。然而,两者提供的日志记录非常不同,它们都产生不同的结果。Roslyn——C#编译器平台——是一个.NET标准2.0库,这意味着它可以在.NET Framework 4.6.1+和.NET Core 2.0+(1)上运行 Visual Studio(包括MSBuild)在.NET Framework上运行。使用Visual Studio(或直接使用MSBuild)生成项目时,它会在.NET Framework上运行Roslyn。VisualStudio知道如何处理SDK样式的CSPROJ和遗留的非SDK样式的CSPROJ,并相应地调用Roslyn。使用的Roslyn版本与Visual Studio版本绑定
dotnet build
是一个独立的工具,是.NET核心应用程序。它只知道如何构建SDK风格的csprojs,它通过在.NETCore上运行Roslyn来实现这一点。Roslyn与.NET核心SDK一起发布,并且dotnet build
从这些已安装的SDK版本(通常是最新版本)之一加载Roslyn
这两种构建C#项目的方法或多或少是等效的,它们调用相同的编译器代码。但是,它们的运行位置不同(Visual Studio是.NET Framework,仅限Windows,dotnet build
是.NET核心,可以在多个平台上运行),以及是否可以构建传统的非SDK风格的CSPROJdotnet build
从命令行使用起来也有点好
请注意,加载Roslyn的运行时与Roslyn可以发出的已编译IL无关:运行在.NET Framework上的Roslyn可以发出由.NET Core执行的IL
如果您使用的分析器以.NET核心为目标(不太可能,因为鼓励分析器以.NET标准2.0为目标),则这些分析器将仅从dotnet build
运行
(1) 我用“.NET Core”来指代.NET Core和.NET 5+。Roslyn——C#编译器平台——是一个.NET标准2.0库,这意味着它可以在.NET Framework 4.6.1+和.NET Core 2.0+(1)上运行 Visual Studio(包括MSBuild)在.NET Framework上运行。使用Visual Studio(或直接使用MSBuild)生成项目时,它会在.NET Framework上运行Roslyn。VisualStudio知道如何处理SDK样式的CSPROJ和遗留的非SDK样式的CSPROJ,并相应地调用Roslyn。使用的Roslyn版本与Visual Studio版本绑定
dotnet build
是一个独立的工具,是.NET核心应用程序。它只知道如何构建SDK风格的csprojs,它通过在.NETCore上运行Roslyn来实现这一点。Roslyn与.NET核心SDK一起发布,并且dotnet build
从这些已安装的SDK版本(通常是最新版本)之一加载Roslyn
这两种构建C#项目的方法或多或少是等效的,它们调用相同的编译器代码。但是,它们的运行位置不同(Visual Studio是.NET Framework,仅限Windows,dotnet build
是.NET核心,可以在多个平台上运行),以及是否可以构建传统的非SDK风格的CSPROJdotnet build
从命令行使用起来也有点好
请注意,加载Roslyn的运行时与Roslyn可以发出的已编译IL无关:运行在.NET Framework上的Roslyn可以发出由.NET Core执行的IL
如果您使用的分析器以.NET核心为目标(不太可能,因为鼓励分析器以.NET标准2.0为目标),则这些分析器将仅从dotnet build
运行
(1) 我用“.NET Core”来指代.NET Core和.NET 5+。同一个底层编译器,调用它的东西不同。编译器本身以.NET标准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文件)@canton7谢谢您的评论。在VS中构建时,它是如何做到的?.NET核心项目是否使用dotnet build,.NET Framework项目是否使用msbuild?否,VS中的building将始终在.NET Framework上运行编译器:VS有效地使用msbuild。正在编译的应用程序的目标运行时(技术上)完全独立于编译器本身当前正在执行的运行时:在.NET Framework上运行的Roslyn可以发出IL,而该IL由.NET Core执行dotnet build
确实意味着编译器可以在不支持.NET Framework的目标(例如Linux)上运行,而且对于命令行使用来说,它是一个更好的界面。好吧,这很有意义。谢谢你花时间解释它来帮助我理解它,而不仅仅是因为它简单而投反对票!还值得注意的是,编译器附带有VS,因此其版本与VS版本一致,您可以通过升级VS获得新的编译器版本。编译器也包含在.NET SDK和dotnet build中