Microsoft.CodeDom.Providers.DotNetCompilerPlatform和Microsoft.Net.Compilers有什么区别?

24 浏览
0 Comments

Microsoft.CodeDom.Providers.DotNetCompilerPlatform和Microsoft.Net.Compilers有什么区别?

我将.NET 4.6.1升级到4.7.2的一个旧项目中包含对Microsoft.Bcl.Build的引用,另一个项目则引用了Microsoft.Net.Compilers。由于Microsoft.Bcl.Build非常过时(2014年),所以我们可以忽略它。\n我了解到Microsoft.Net.Compilers在一段时间内被废弃,并且曾经是Microsoft.CodeDom.Providers.DotNetCompilerPlatform的一个依赖项。然后,在2.x中更新的Microsoft.CodeDom.Providers.DotNetCompilerPlatform不再依赖于Microsoft.Net.Compilers。\n现在,事情似乎又发生了变化,因为Microsoft.CodeDom.Providers.DotNetCompilerPlatform自2018年以来没有更新,而Microsoft.Net.Compilers仅在22天前更新,新增了对C# 8的支持!Microsoft.Net.Compilers页面(https://github.com/dotnet/roslyn/blob/master/docs/wiki/NuGet-packages.md)在底部提到了Microsoft.CodeDom.Providers.DotNetCompilerPlatform包,但并没有真正解释它们之间的关系或为什么多年来没有更新。奇怪的是,另一个项目将其作为一个依赖项,然后删除了它,现在却不再维护。\n其他建议是,System.Net.Compilers已被废弃,请使用System.Net.Compilers.ToolSet,还有其他建议是“两者都不要使用”,因为它们都不适用于一般使用,并且在VS 16.5之后将不再可用:https://stackoverflow.com/a/60623906/88409。\n这些包似乎都会覆盖构建系统,所以它们是互斥的吗?当两者都安装时,我确实会遇到错误(下面有解释),但这可能不一定是由互斥引起的。\n


\n附加信息\n当以.NET 4.7.2为目标,两个包都未安装时,我在MVC cshtml页面上遇到以下错误:\n

\n类型\'System.Object\'在一个未引用的程序集中定义。您必须添加对程序集\'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51\'的引用。\n Home\".\n

\n安装System.Net.Compilers不能解决此问题,尽管发布成功。与此同时,仅安装Microsoft.CodeDom.Providers.DotNetCompilerPlatform可以修复此错误。后者唯一不同的是它在web配置文件中为system.codedom/compilers/compiler添加了一个language=\"c#\"的部分。\n尽管这两个包都可以单独安装,但如果我同时安装这两个包,发布操作将失败,并显示错误消息“Microsoft.Net.Compilers仅支持MSBuild v16.3”,因此看起来Microsoft.CodeDom.Providers.DotNetCompilerPlatform是否强制使用(或基于)早期版本的MSBuild?项目文件的ToolsVersion属性为14(尽管将其设置为其他任何值似乎都没有任何效果。例如,我将其设置为215它也不会报错。这一切非常令人困惑。

0