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


106

Я хочу использовать C # 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


3
Любой загружает MS Build Tools 2015 по ссылкам , приведенных ниже, они предназначены для старого (до обновления) версии , которая имеет ошибки ... Я нашел ссылку здесь до 2015 Update 3.
bdrajer

Ответы:


164

Обязательно звоните:

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

Это версия MsBuild, которая поставляется с Visual Studio 2015 и вызывает компилятор C #, который это понимает. Вы можете получить эту версию 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
Есть ли какие-либо опасения по поводу того, что это вызывает ошибки, так как RyuJIT или что-то еще имеет так много ошибок?
Маслоу

3
Просто примечание об этом: если вы обновляете переменную env PATH, обязательно удалите старое местоположение (например, C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319), потому что оно все еще может вызывать это при выполнении «msbuild "от cmd
TheWebGuy

2
Я также должен был установить Microsoft.Net.Compilers пакет NuGet: см stackoverflow.com/a/36774876/584714
DrGriff

2
Есть ли решение этой проблемы без необходимости устанавливать пакет nuget в каждый проект? У меня есть сотни проектов, которым это может понадобиться, и мне это кажется ненужным. Кажется, где-то ошибка.
Cole W

2
Есть ли у кого-нибудь ответ на вопрос @ColeW?
Зинов

61

Кстати, вы также можете установить «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

ИМХО есть причина, почему вопрос касается именно этой среды. Лучше прокомментируйте вопрос.
jogo

24
Поскольку stackoverflow не позволяет мне комментировать вопросы, я разместил его только так, как позволяют мне системы. И если вы не находите это полезным, просто игнорируйте его. Для меня, когда я искал решение на моем сервере сборки, это был путь, вместо установки VS2015
MuhKuh

После установки «Microsoft Build Tools 2015» (или «Microsoft Build Tools 2017») вы также можете контролировать, какую версию Visual Studio вы хотите использовать для создания решения: MSBuild.exe / t: Build YourSolution.sln / p : VisualStudioVersion = 14.0 [установите значение 10.0 для VS2010, 14.0 для VS2015 и 15.0 для VS2017]
Alex Sanséau

Чтобы загрузить и установить Microsoft Build Tools 2015 Update 3 , посетите старые загрузки VS и перейдите в Redistributables and Build Toolsраздел.
RBT

12

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

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

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

Как уже упоминалось другими, я попытался использовать пакет NuGet Microsoft.Net.Compilers. Последняя версия позволяла сборке работать на моем сервере сборки, но не позволяла мне публиковать свой код локально (мое требование). Более ранние версии этого пакета 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, вам нужно будет установить Build Tools 2017 и ваши проекты ориентированы на 15.0 вместо 14.0, но я не проверял это.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.