Microsoft.Net.Compilers的目的是什么?

95

这个编译器的重要性是什么?它是必须拥有的还是可以没有?再有另一个编译器的目的是什么,还是只是未来主义的项目?简要概述会很受欢迎。


2
它也是 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 在 v1.0.8 及以下版本中的一个依赖项,因此您可能会因此看到它。 - KyleMit
2
根据微软公司的说法,Microsoft.Net.Compilers已经被废弃,推荐使用Microsoft.Net.Compilers.Toolset - Uwe Keim
4个回答

99
Microsoft.Net.Compilers包的目的是使用该包分发的编译器来编译您的项目,而不是使用.NET Framework或Visual Studio附带的编译器。最实用的直接好处是它允许您的项目使用C# 6功能,然后允许在没有安装C# 6编译器的系统上构建这些项目,例如在连续集成服务器上,在那里您不想安装完整的Visual Studio 2015。

我需要做一件非常简单的事情,那就是编译任何.cs文件并发出il,无需验证外部引用等。这可以使用Microsoft.Net.Compilers吗? - Bandara
@Bandara,没有外部引用是不可能编译C#的,无论是否使用Microsoft.Net.Compilers。例如,需要引用程序集进行重载解析。如果您确实有外部引用,则在技术上可以使用Microsoft.Net.Compilers,但这真的不是正确的工具。当您可以直接调用其他软件包中可用的同一编译器时,您将启动外部进程。 - user743382
请查看来自@JaredPar(MS)的更新答案,此答案已不再有效。我们应该检查我们的解决方案,并删除旧的软件包,以便使用最新的VS / VSCode / SDK工具集进行构建。 - Tony Wall

39
目前 Microsoft.Net.Compilers 没有任何作用。这是一个 NuGet 包,已经被弃用,并将在 Visual Studio 16.5 后停止生产。有一个后继包名为 Microsoft.Net.Compilers.Toolset。这个包具有与 Microsoft.Net.Compilers 几乎相同的功能,但可以与 .NET 桌面和 .NET Core MSBuild 实例一起使用。
即使如此,Microsoft.Net.Compilers.Toolset 不适用于一般消费。该包有两个具体用途:
1. 担任短期解决方案,用于解除编译器中出现崩溃错误的客户的限制。针对这样的客户,我们可以使用此包在将修复程序合并到 Roslyn 存储库后的一小时左右解除其场景限制。这充当了桥梁,直到修复程序进入相关的 Visual Studio 或 .NET SDK 补丁版本。那时,要求客户从其解决方案中删除该包,并依赖于正式发布的工具集。 2. 作为在 Roslyn 和 .NET SDK 官方构建之间移动二进制文件的机制。
该软件包适用于客户长期构建的一般消费。我知道一些客户选择这样做,但这种使用也没有受到支持。该包可能会定期因依赖于 .NET SDK 中新版本的 MSBuild 或任务/目标而导致故障。

想要使用新版本的编译器构建应用程序的客户端被鼓励使用官方发行版的编译器:

  1. 使用 Visual Studio Build Tools SKU
  2. 使用 .NET SDK

注意:几年前,Microsoft.Net.Compilers 包是 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 包的一部分,因为有依赖关系。但是从 2.0 版本开始,不再依赖 Microsoft.Net.Compilers,现在它成为了一个独立的包。同时,我们已经开始停用 Microsoft.Net.Compilers,因为它不再具有显式的用例。

这意味着一些客户可能会意外发现其项目文件中仍然包含 Microsoft.Net.Compilers,因为当 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 删除了对它的依赖时,它没有被删除。对于这样的客户,建议只需删除对该包的引用,它已经不再需要了。


非常有趣的见解。我想知道为什么NuGet包的描述中没有提到仅限短期使用的方面:https://www.nuget.org/packages/Microsoft.Net.Compilers/ - Jack Miller
@JackMiller,这在Microsoft.Net.Compilers.Toolset中有提到。 此软件包主要用于快速向客户提供热修复补丁。明确不支持将其作为为旧的MSBuild安装提供更新的编译器的长期解决方案。那样做可能会经常导致故障。 - Youssef13
Microsoft.Net.Compilers和Microsoft.CodeDom.Providers.DotNetCompilerPlatform的目的是什么?这两个包似乎都包含相同的编译器!或者这是因为我正在查看DotNetCompilerPlatform的最新版本? - Murphybro2

6

这是一个提供开源C#和Visual Basic编译器以及丰富的代码分析API的软件包。

您可以在GitHub上找到详细的文档:

https://github.com/dotnet/roslyn


5
谢谢。我之前看过官方文档,但仍觉得该项目的目的含糊不清。 - usefulBee
2
@usefulBee 基本上它是微软开源运动的结果,可以查看维基百科获取更多信息:https://en.wikipedia.org/wiki/.NET_Compiler_Platform - ViRuSTriNiTy

1
正如其他人所说,这个包含了C#和VB.NET的.NET编译器。
这个包作为一个有趣的方面是,你可以指定一个特定版本的编译器来为你的项目构建,包括那些尚未随Visual Studio一起发布的版本。
我们在https://github.com/dotnet/project-system中使用它,这是Visual Studio的一个开源组件。它允许我们使用预发布版本的编译器来测试语言功能,这些功能不受VS附带的编译器的支持。

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