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


83

这个编译器的重要性是什么?是必须拥有还是可以没有?无论如何,拥有另一个编译器的目的是什么,或者仅仅是一个未来的项目?一个简短的概述,将不胜感激。


2
它也是Microsoft.CodeDom.Providers.DotNetCompilerPlatformv1.0.8及以下版本中的依赖项,因此您可能会因此而看到它
KyleMit

1
根据Microsoft的说法Microsoft.Net.Compilers不赞成使用Microsoft.Net.Compilers.Toolset
Uwe Keim

Answers:


95

Microsoft.Net.Compilers软件包的重点是,与该软件包一起分发的编译器将用于编译项目,而不是.NET Framework或Visual Studio附带的编译器。最实际的直接好处是,它允许您的项目使用C#6功能,然后允许将这些项目构建在未安装C#6编译器的系统上,例如,在您未安装C#6编译器的系统上想要安装完整的Visual Studio 2015。


我需要做一个非常简单的事情,那就是编译任何.cs文件并发出il,无需验证外部引用等。Microsoft.Net.Compilers是否可能?
班达拉

@Bandara没有Microsoft.Net.Compilers,没有外部引用就无法编译C#。例如,需要引用的程序集来解决过载。而且,如果您确实有外部引用,那么使用Microsoft.Net.Compilers在技术上是可行的,但这实际上是错误的工具。如果其他软件包中已经有相同的编译器,并且您可以直接在自己的程序中调用,则您将启动一个外部进程。

请参阅@JaredPar(MS)的更新答案,该答案不再有效。猜猜我们应该检查我们的解决方案,并删除旧软件包,以便使用最新的VS / VSCode / SDK工具集进行构建。
托尼·沃尔

16

目前,Microsoft.Net.Compilers没有任何用途。这是一个不建议使用的NuGet程序包,在Visual Studio 16.5之后将停止生成。有一个名为Microsoft.Net.Compilers.Toolset的后继程序包。该程序包具有与Microsoft.Net.Compilers相同的功能,但可与.NET Desktop和.NET Core MSBuild实例一起使用。

即使这样,Microsoft.Net.Compilers.Toolset也不适合一般消费。该软件包有两种特定用途:

  1. 充当解除阻塞编译器中崩溃错误的客户的短期工具。对于此类客户,我们可以在将修订合并到Roslyn存储库后仅一个小时左右的时间,使用此程序包解除对他们的方案的阻止。在修复程序将其纳入关联的Visual Studio或.NET SDK服务版本之前,这将充当桥梁。发生这种情况时,将要求客户从其解决方案中删除软件包,并依靠正式发布的工具集。
  2. 用作在Roslyn和.NET SDk的正式版本之间移动二进制文件的机制。

此软件包并不打算供客户一般长期使用。我了解到有些客户选择这样做,但也不支持这种用法。该软件包可以并且会经常因依赖MSBuild的新版本或.NET SDK中的任务/目标而导致中断。

鼓励希望使用新版本编译器进行构建的客户使用编译器的官方发行版之一:

  1. 使用Visual Studio生成工具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程序包的描述中没有提到有关仅短期使用的方面:nuget.org/packages/Microsoft.Net.Compilers
Jack Miller

@JackMiller在Microsoft.Net.Compilers.Toolset中提到过。`此软件包的主要用途是用于快速将修补程序发送给客户的方法。明确不支持将其用作长期解决方案以在较旧的MSBuild安装上提供较新的编译器。这可以和将打破定期basis.`
Youssef13


1

正如其他人所说,它包含用于C#和VB.NET的.NET编译器。

打包的有趣之处在于,您可以为项目指定编译器的特定版本,包括Visual Studio尚未附带的版本。

我们在https://github.com/dotnet/project-system中使用它,它是Visual Studio的开源组件。它使我们能够使用预发行版的编译器来处理VS附带的编译器不支持的dogfood语言功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.