Как обновить msbuild до С# 6?

Я хочу использовать С# 6 в моем проекте (нулевое распространение, другие функции).

Я установил VS 2015 на свой компьютер, и он блестяще работает и строит тестовый код, например

var user = new SingleUserModel(); //all model fields are null
var test = user.User?.Avatar?["blah"];

Но когда я нажимаю свой проект на репо, и CI начинает его строить, сборка завершается сбоем из-за неподдерживаемого ?.

Я установил VS2015 на сервере CI, но выгляжу так, как будто он его не использует. Что я могу сделать?

CI - CruiseControl.NET Строит с C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

Ответ 1

Убедитесь, что вы звоните:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe

Это версия MsBuild, которая поставляется с Visual Studio 2015 и вызывает компилятор С#, который понимает это. Вы можете получить эту версию MsBuild в своей системе, установив любой выпуск Visual Studio 2015 или установив автономные инструменты Microsoft Build Tools 2015.

Добавление ссылки на следующий пакет NuGet также приведет к использованию нового компилятора:

Install-Package Microsoft.Net.Compilers

Обратите внимание, что Install-Package выберет последнюю доступную версию, которая может быть не той, которую вы ищете. Перед установкой проверьте примечания к выпуску и зависимости, чтобы устранить основную проблему с рассматриваемой версией, которая в данном случае была более специфичной для VS 2015.

Итак, для Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0

Ответ 2

Вы можете, кстати, также установить "Microsoft Build Tools 2015" вместо VS2015 на вашем сервере сборки.

https://www.microsoft.com/en-us/download/details.aspx?id=48159

Он устанавливает MSBuild по тому же пути:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe

Ответ 3

Возможно, у вас уже есть эта работа, но это может помочь кому-то еще в будущем. Я недавно столкнулся с этим вопросом, и он заставил меня двигаться в правильном направлении и в конечном итоге привел к решению.

Другим возможным решением этой проблемы является ручное обновление файлов вашего проекта в соответствии с версией MSBuild, с которой вы хотите создавать свои проекты.

Недавно я прошел обновление сервера сборки TeamCity и уже установил на него инструменты Microsoft Build Tools 2015. Я думал, что у меня все есть на сервере сборки, у меня было решение, ориентированное на С# 6.0, и каждый проект был нацелен на .net 4.6.1. Как и вы, все, что с С# 6.0-специфичным кодом, прекрасно скомпилировано в моей локальной среде, но моему серверу сборки TeamCity это не понравилось.

Как уже упоминалось, я пытался использовать пакет NuGet для Microsoft.Net.Compilers. Последняя версия позволяла сборке работать на моем сервере сборки, но не позволяла мне публиковать свой код локально (мое требование). Более ранние версии этого пакета NuGet позволяли мне публиковать, но сборка не работала.

Я обнаружил, что в конечном итоге мне нужно было изменить каждый файл проекта в моем решении, чтобы он специально предназначался для версии MSBuild, которая могла обрабатывать код С# 6.0. В каждом из моих файлов проекта я нашел строку, похожую на следующую:

<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 и смог собрать свой код С# 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, но я не проверял это.