Roslyn与MsBuild有什么关系?

28
我想知道:Roslyn和MsBuild的关系是怎样的?
我的理解是:
1. Roslyn是一个编译引擎 2. MsBuild主要是一组规范,用于定义.csproj,.sln文件等项目的设置。
然而,MsBuild也附带了msbuild.exe - 如果我没记错的话,它可以实际编译项目。但是,如果msbuild.exe能够编译项目,那么这会如何与Roslyn相关联呢?
在MSBuild 15的情况下,msbuild.exe是否使用Roslyn来编译?它们是完全独立的吗?我有什么误解吗?
此外,更具体地说:假设我想以编程方式创建简单的.csproj文件,并使用Roslyn的MSBuildWorkspace来处理/填充并最终编译这些文件。那么,我的应用程序的最终用户是否需要在其计算机上安装Microsoft的构建工具?或者说这不是必要的,因为Roslyn能够独立读取和编译这些文件,而不需要任何本地MSBuild安装?

1
如果您正在构建扩展,可以将所有所需的dll打包到其中。 - johnny 5
5
"MSBuild" => msbuild.exe, "Roslyn" => csc.exe. - Christian.K
@johnny5 有没有想法是哪些包?有试过使用 NuGet 包吗?我尝试了很长时间在没有安装 msbuild 15 的机器上让 MSBuildWorkspace 正常工作。遇到了非常奇怪的错误;对工作区所做的一些更改可以正确地保存到 csproj 文件中,但其他更改则会崩溃并显示出毫无意义的 NullReferenceExecptions 等错误。但同样的代码在安装了 MSBuild 15 的机器上可以正常运行。 - Bogey
@Bogey,嗯...Roslyn非常有bug。我在尝试实现时遇到了几个问题。很多时候,当我在使用Roslyn时,它会在DDL中发现歧义,不知道如何正确处理,只会抛出一个随机的通用错误。你可能需要从你的hive中删除MEF组件缓存。 - johnny 5
我最近看了一个YouTube视频,演示了使用Roslyn进行AOP https://www.youtube.com/watch?v=D52Y8mYKvDk(我不在那家公司工作,也不知道这个视频在实践中有多大帮助)。 - Andrei Epure is hiring
显示剩余2条评论
1个回答

32

MSBuild 是 Visual Studio 的构建系统。它调用 C# 编译器来编译 C# 项目。 Roslyn 是 C# 编译器(以及 VB 编译器)。因此,msbuild 使用 Roslyn。

然而,Roslyn 包含的不仅仅是编译器。它还包括一个 VS 插件,提供 IDE 功能(自动完成列表、着色、代码修复等)。

此外,Roslyn 还是用于分析源代码的 API,您可以从自己的应用程序中使用它。对于这种最后一种情况,它具有称为 MSBuildWorkspace 的 API,可用于打开要进行分析的项目或解决方案。该工作区使用 MSBuild 查找项目和解决方案中的所有部分。因此,Roslyn 的这一部分使用了 MSBuild。


14
MSBuild是Visual Studio的构建系统。严谨地说,您也可以通过启动msbuild.exe在没有Visual Studio的情况下使用MSBuild,这在构建系统中很常见。 - RenniePet
非常好的回答。谢谢。现在有了流行的Visual Studio替代品(如Rider),RenniePet的评论变得有意义了。人们可以将Rider用作EDI,它使用msbuild作为编译器。人们也可以将Rider用作EDI,它使用Roslyn作为静态分析器。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接