Как использовать С# 6 с типом проекта веб-сайта?

Обновлен существующий тип проекта веб-сайта Visual Studio 2015, я изменил Framework на 4.6.

Затем я ожидал, что все мои новые функции будут доступны в моем коде за файлами.

К сожалению, я получаю такие ошибки, как:

Ошибка CS8026: Функция "выражение-тело" не доступна на С# 5. Используйте язык версии 6 или выше.

или, например:

Ошибка CS8026: функция "интерполированные строки" недоступна на С# 5. Используйте язык версии 6 или выше.

Я сделал быструю проверку Google и нашел парень, размещающий некоторые комментарии в блоге Postgrade ScottGu (поиск на странице "8026" ).

Поскольку я не понимаю его решения, плюс я хочу, чтобы решение было более заметным, я создал эту публикацию SO.

Мой вопрос:

Как я могу создать проект Visual Studio 2015 типа Web Site (т.е. не веб-приложение) для распознавания функций С# 6?

Ответ 1

Я тестировал это с помощью ASP.NET MVC 5 (проверено 5.2.3), и ваш пробег может отличаться от других веб-фреймворков, но вам просто нужно добавить Roslyn CodeDOM | NuGet пакет

Поставщики CodeDOM для .NET Compiler...

Сменные поставщики CodeDOM, которые используют новый компилятор .NET Compiler Platform ( "Roslyn" ) в качестве сервисных API. Это обеспечивает поддержку новых языковых функций в системах с использованием CodeDOM (например, компиляции в ASP.NET), а также улучшает производительность компиляции этих систем.

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

Пакет NuGet должен добавить файлы DLL и добавить следующее к вашему web.config.

  <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>

Если он все еще отсутствует. Попробуйте добавить себя.

Ответ 2

См. также это сообщение в блоге из Sayed Ibrahim Hashimi о том, как это сделать это через VS IDE.

В Visual Studio 2015 Update 1 мы включили новую функцию, чтобы упростить это. Когда у вас есть решение, в котором есть хотя бы один веб-проект, который нацелен на .NET 4.5+ и не имеет пакета DotNetCompilerPlatform NuGet в меню "Проект", вы увидите новую опцию "Включить С# 6/VB 14".

введите описание изображения здесь

Ответ 3

Возможные решения, взятые из комментарии к размещению блога ScottGu (поиск на странице "8026" ):

Решение 1 (Дэвид Тейлор)

Добавьте эти элементы домена RTM code в web.config:

<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>

Затем добавьте файлы Roslyn и Microsoft.CodeDom.Providers. *.ll в свой каталог BIN.

Достаточно просто настроить, но мне было просто странно, что шаблон по умолчанию не был настроен для него, если вы выбрали .NET 4.6 при создании нового "веб-сайта" в RTM VS 2015.

Решение 2 (Мартин)

В дополнение к вышеприведенному комментарию Дэвида Тейлора, похоже, что параметры system.codedom верны, когда веб-приложение создается с помощью TargetFramework как по умолчанию v4.5.2. Изменение параметра TargetFramework на v4.6, по-видимому, изменяет параметры компилятора для CSharp таким образом, что это вызывает проблему.

Мое обходное решение было следующим:

  • Файл/Новый/Веб-приложение ASP.NET
  • Выберите шаблон "Веб-API" из шаблонов ASP.NET 4.5.2
  • Возьмите копию элемента system.codedom(и его содержимого) в файле web.config
  • Используя свойства /TargetFramework, установите Target Framework в 4.6
  • Замените измененный элемент system.codedom в файле web.config с копией, сделанной до изменения TargetFramework.
  • Хит F5

Главная страница должна загружаться так, как ожидалось.

Информацию, содержимое system.codedom сразу же после изменения TargetFramework на v4.6. был следующим (обратите внимание на использование типа "Microsoft.CSharp.CSharpCodeProvider" ):

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
            <providerOption name="CompilerVersion" value="v4.0"/>
        </compiler>
        <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>

Ответ 4

Я установил DotNetCompilerPlatform в качестве предлагаемого @jbtule, но все равно получал те же ошибки.

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Я закрыл решение, удалил папки bin и obj, затем открыл решение и перестроил. Теперь функции С# 6 работают.

Ответ 5

Ни один из других ответов не работал у меня. Мы нашли способ переключить С# 6 в Visual Studio UI и... он сработает! Это такой простой вариант, стоит попробовать сначала.

  • Щелкните правой кнопкой мыши свой проект и выберите Свойства.
  • Перейдите на вкладку Сборка.
  • В закладке сборки есть кнопка Дополнительно... в самом низу.
  • Это открывает Расширенные настройки сборки, как показано ниже. Выберите С# 6.0.

введите описание изображения здесь

Ответ 6

Я получил эту ошибку после внесения изменений ZERO в мой проект WebAPI. Я удалил пакет nuget DotNetCompilerPlatform и переустановил, что устранило проблему.