Как использовать С# 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=\"Web\" /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=\"Web\" /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=\"Web\" /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 и переустановил, что устранило проблему.