Як оновити 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 року 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
Лише зауважте про це, якщо ви оновлюєте змінну PATH env, не забудьте видалити старе місце розташування (наприклад: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319), оскільки воно все ще може викликати це при виконанні "msbuild "від cmd
TheWebGuy

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

2
Чи є для цього рішення без необхідності встановлювати пакет нута в кожен проект? У мене є 100 проектів, які потребували б цього, і мені це здається непотрібним. Схоже, десь помилка.
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]
Алекс Сансо

Щоб завантажити та встановити Microsoft Build Tools 2015 Update 3 , відвідайте старі завантаження VS та перейдіть до Redistributables and Build Toolsрозділу.
РБТ

12

Напевно, ви вже працюєте, але це може допомогти комусь іншому в майбутньому. Нещодавно я натрапив на це питання, і це змусило мене рухатись у правильному напрямку і, врешті-решт, призвело до вирішення.

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

Нещодавно я пройшов оновлення сервера збірки TeamCity, і вже встановив на нього Microsoft Build Tools 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.

Мені також довелося вручну оновити xget-вузол 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, але я цього не підтвердив.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.