Ошибка CS1056: Неожиданный символ '$' запускает msbuild в процессе непрерывной интеграции tfs

У меня есть проект, в рамках которого .NET Framework 4.6.1 нацелена на .NET Framework 4.6.1, как часть процесса непрерывной интеграции на tfs, который мы создали для задачи Build Solution, чтобы убедиться, что код компилируется правильно.
Теперь сервер TFS имеет последнюю версию .Net Famework 4.6.2. В регистре это значение для ключа Release рамки

Во всех других версиях ОС: 394806 =>.NET Framework 4.6.2

Но когда он запускается, он приходит с этой ошибкой:

Error CS1056: Unexpected character '$'

Я не хочу заменить интерполяцию строк на string.Format для решения этой проблемы, пожалуйста, предоставьте еще один способ обхода решения.

Нужно ли мне устанавливать что-то еще на сервере TFS?

Ответ 1

Проблему можно устранить, установив пакет Nuget Microsoft.Net.Compilers. Ниже приведена ссылка моего выделенного ответа: Project строит отлично с помощью Visual Studio, но выходит из командной строки

Эта функция является синтаксическим сахаром для С# 6, попробуйте установить последнюю версию фреймворка 4.6.2 https://www.microsoft.com/en-us/download/details.aspx?id=53345

Затем перейдите в свойства проекта и измените параметры приложения на целевой структуре, чтобы указать на последние. Вам не нужно менять свой код, чтобы заменить интерполяцию строк на метод string.Format, чтобы исправить это. Если вы все еще получаете эту ошибку, это потому, что компилятор, который запускает вашу сборку, не является последней версией С#, попробуйте добавить Microsoft.Net.Compilers из Nuget и снова скомпилировать, что должно решить проблему. Если вы хотите избежать установки этого пакета, попробуйте открыть свой.csproj и взглянуть на ToolsVersion.that следует указывать на версию 12, а затем изменить его на 14, но убедитесь, что вы установили последнюю версию MSBuild с https://www.microsoft.com/en-us/download/details.aspx?id=48159 или перейти к C:\Program Files (x86)\MSBuild\14.0\Bin, там вы должны иметь эту папку с компилятор csc.exe. Если даже тогда это не решит проблему, попробуйте выполнить следующие шаги: https://msdn.microsoft.com/en-us/library/bb383985.aspx.

По моему опыту я решил эту проблему тремя способами:

1- просто получает пакет от Nuget

2- установка Microsoft Build Tools 2015 на сервере tfs

3- Кувалда и последние варианты, но для меня лучше всего, потому что вам не нужно иметь дело с зависимостью от nuget, устанавливает визуальную студийную версию на сервере tfs, где вы запускаете этот процесс.

Надеюсь это поможет

Ответ 2

После установки средств MS Build 2015 в %ProgramFiles%\MSBuild\14.0\bin вам необходимо переопределить версию MSBuild для сервера сборки с новым значением (14.0).

Вы должны прочитать статью MSDN (или этот ответ), но TL; DR ваши варианты:

  • Переверните версию с помощью переключателя /ToolsVersion (или /tv, если коротко), когда вы строите проект или решение из командной строки:

    msbuild.exe someproj.proj /tv:14.0 /p:Configuration=Debug
    
  • Переопределить версию, установив параметр ToolsVersion в задаче MSBuild:

    <MSBuild Projects="myProject.proj"  
        ToolsVersion="14.0"  
        Targets="go" />
    
  • Переопределите версию, установив свойство $(Project.ToolsVersion) в проекте в рамках решения. Это позволяет вам создавать проект в решении с помощью ToolsetVersion который отличается от проекта других проектов:

    <Project ToolsVersion="14.0" ... </Project>  
    

Порядок приоритета, от самого высокого до самого низкого, используемый для определения ToolsVersion:

  1. ToolsVersion в задаче MSBuild используемый для создания проекта, если таковой имеется.
  2. Переключатель /toolsversion (или /tv), который используется в команде msbuild.exe, если таковой имеется.
  3. Если MSBUILDTREATALLTOOLSVERSIONSASCURRENT переменная среды MSBUILDTREATALLTOOLSVERSIONSASCURRENT, используйте текущую ToolsVersion.
  4. Если MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT переменная среды MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT а ToolsVersion определенная в файле проекта, больше, чем текущая ToolsVersion, используйте текущую ToolsVersion.
  5. Если MSBUILDLEGACYDEFAULTTOOLSVERSION переменная среды MSBUILDLEGACYDEFAULTTOOLSVERSION или если ToolsVersion не установлен, используются следующие шаги:
  6. Если переменная среды MSBUILDLEGACYDEFAULTTOOLSVERSION не установлена, используются следующие шаги:
    • Если переменная среды MSBUILDDEFAULTTOOLSVERSION установлена в существующую ToolsVersion, используйте ее.
    • Если DefaultOverrideToolsVersion установлен в MSBuild.exe.config, используйте его.
    • Если DefaultOverrideToolsVersion установлен в реестре, используйте его.
    • В противном случае используйте текущую ToolsVersion.

Ответ 3

Есть вероятность, что вы создаете неправильный файл MSbuild.exe; выполните компиляцию в Visual Studio (где она работает) и проверьте журналы в Output. Должно быть что-то вроде:

1>Target "GetReferenceAssemblyPaths" in file "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets" 

Убедитесь, что вы используете MSBuild.exe в этом каталоге Bin, в моем случае;

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSbuild.exe

Ответ 5

Мое решение было 2 части:

1) Используя Visual Studio 2015, выберите свой веб-проект, щелкните меню "Проект", выберите "Включить С# 6",

2) Мне нужно было добавить следующее в конец моего продукта web.config непосредственно перед закрывающим тегом конфигурации. Обратите внимание, что номера версий могут измениться в будущем, но ключ должен искать аналогичный текст в вашей разработке web.config после включения на шаге 1 и убедиться, что он передается в производство.

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>