您可能已经在进行此工作,但是将来可能会对其他人有所帮助。我最近遇到了这个问题,它使我朝着正确的方向前进,并最终找到了解决方案。
对此的另一种可能的解决方案是手动更新项目文件,以定位要用来构建项目的MSBuild版本。
我最近经历了TeamCity构建服务器更新,并且已经在其上安装了Microsoft Build Tools 2015。我以为我在构建服务器上拥有了所有东西,有针对C#6.0的解决方案,而且有针对.net 4.6.1的每个项目。像您一样,所有具有C#6.0特定代码的东西都可以在我的本地环境中很好地构建,但是TeamCity构建服务器不喜欢其中的任何一个。
正如其他人提到的,我尝试使用Microsoft.Net.Compilers NuGet包。它的最新版本允许该构建在我的构建服务器上运行,但不允许我在本地发布我的代码(这是我的要求)。该NuGet程序包的早期版本可以让我发布,但是该构建无法正常工作。
我发现我要做的是最终修改解决方案中的每个项目文件,以专门针对可以处理C#6.0代码的MSBuild版本。在每个项目文件中,我都找到与以下行相似的行:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
该行的关键部分是其中的ToolsVersion部分。我只是将项目文件上的这一行更改为以下内容:
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
此处的区别是我针对的是版本14,而不是4。版本14.0与Build Tools 2015相对应。通过更改此版本,我的TeamCity生成服务器使用了正确的MSBuild版本,并能够生成我的C#6.0代码。
我还必须手动更新它的TargetFrameworkVersion xml节点以使用4.6.1,因为VS2015的操作不正确并弄乱了我的本地版本,但这与这里无关。
请,如果我错了,请有人纠正我,但仅供参考,我认为版本号如下所示:
4.0 = VS2012
12.0 = VS2013
14.0 = VS2015
15.0 = VS2017
我相信,如果您想使用.net 4.7,则必须安装Build Tools 2017,并且将项目定位为15.0而不是14.0,但我尚未对此进行验证。