希望有人可以阐明我在这里出错的地方。
我们有许多使用VS 2015构建的共享程序集,它们已经在使用某些C#6语言功能(字符串插值,空条件运算符等)。我们不需要将Roslyn Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider nuget引用添加到这些项目; Visual Studio / msbuild只是为我们处理了。
最近,我正在研究一个ASP.Net网站项目,我们已经对其进行了预编译,并使用msbuild进行了构建。我必须在该解决方案上更新目标框架,以便我们可以使用这些共享程序集-但我仍然无法在后面的代码中使用C#6语言功能。
我发现了有关编译器如何不再是主要.net的一部分,并且不再存在于gac中的帖子,并且要将它们与asp.net网站解决方案和代码背后一起使用,您必须a)更改网站.config以引用较新的编译器,并b)在解决方案中添加对这些编译器的nuget引用。
因此,我的推理是:其他共享程序集不必将Roslyn编译器添加为nuget程序包即可使用这些功能,并且我们正在为编译产品预编译整个解决方案,并且不提供任何编译功能-动态代码落后,因此我们不希望/不需要将Roslyn编译器程序集包含在生成产品中(我们不必为其他WebApi和其他应用程序生成; MSbuild / VS 2015只是在照顾这个问题) -除了字符串插值和空条件运算符外,语法糖似乎也没有额外的运行时要求。
因此,我尝试仅更新web.config节以引用Roslyn编译器。在我的开发机上,我点击了VS中的Build,它运行良好。我在本地系统上运行了msbuild,它运行良好。
但这只是因为Visual Studio隐式添加了Roslyn编译器作为nuget引用。它们显示在packages目录和输出bin目录中。
在构建服务器上,仅运行msbuild,它失败了,因为未获取Roslyn编译器并将其放置在packages文件夹中。
预编译的网站解决方案有没有办法使用C#6.0语言糖而不用其他共享程序集那样将Roslyn引入为nuget包?
谢谢
答案 0 :(得分:1)
事实证明,似乎没有任何优雅的方法可以实现这一目标。 Nuget也对网站解决方案特别不满意,因此,朝这个方向努力的唯一方法是向makefile添加一堆解决方法。
我选择将App_Code下的几乎所有内容都移到一个单独的程序集中,并免费获取该编译。