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


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

Я установил VS 2015 на своем ПК, и он отлично работает и строит тестовый код, например

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

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

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

CI-CruiseControl .NET Строит с C:WindowsMicrosoft.NETFrameworkv4.0.30319MSBuild.exe

3 96

3 ответа:

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

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

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

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

Install-Package Microsoft.Net.Compilers

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

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

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

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

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

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

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

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

то, что я обнаружил, что мне нужно было сделать, в конечном итоге изменило каждый файл проекта в моем решении специально для версии MSBuild, которая могла обрабатывать код C# 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 и смог построить мой код C# 6.0.

мне также пришлось вручную обновить xml-узел TargetFrameworkVersion для использования 4.6.1, потому что VS2015 не делал что-то правильно и испортил мою локальную сборку, но это здесь не актуально.

пожалуйста, кто-нибудь поправьте меня, если я ошибаюсь, но только для справки, я думаю, что номера версий идут примерно так:

4.0 = VS2012

12.0 = VS2013

14.0 = VS2015

15.0 = VS2017

Я считаю, что если вы хотите использовать .net 4.7, у вас должны быть установлены инструменты сборки 2017 и ваши проекты нацелены на 15.0 вместо 14.0, но я не проверил этот.