Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';使用dotnet和MsBuild构建.NET应用程序之间的区别是什么?_C#_.net_Build_Msbuild - Fatal编程技术网

C# 什么';使用dotnet和MsBuild构建.NET应用程序之间的区别是什么?

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.

我第一次不得不在不使用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.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风格的CSPROJ
dotnet 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风格的CSPROJ
dotnet 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中