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

126

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

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

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

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

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

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

Я быстро проверил в Google и нашел парня, который оставлял несколько комментариев в блоге ScottGu (введите на странице поиск «8026»).

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

Мой вопрос:

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

Уве Кейм
источник
1
Вы пробовали добавить элементы конфигурации, которые он упомянул в комментарии?
scheien
Я собирался сделать это, но это выглядит очень странно для меня , так что я ожидал немного более чистое решение.
Уве Кейм
5
Конечно, другой вариант - отказаться от использования этих «проектов» веб-сайтов и вместо этого использовать проекты веб-приложений.
Джон Сондерс
1
@JohnSaunders Я бы с удовольствием это сделал. Поскольку перенос выполняется вручную, я опасаюсь, что на это потребуется время и все ошибки, которые я внесу во время миграции. Сделал это несколько раз для небольших проектов. Всегда были хлопоты ...
Уве Кейм
1
Рад, что вы обдумали это. Комментарий был в основном для других читателей, которые могли подумать, что проект «веб-сайт» звучит так, как они хотят.
Джон Сондерс

Ответы:

118

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

Поставщики CodeDOM для компилятора .NET ...

Замена поставщиков CodeDOM, которые используют компилятор новой платформы компилятора .NET (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>

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

jbtule
источник
1
Это работает, как ожидалось. C # 6 уже доступен. Недостатком является то, что мой App_GlobalResources / Resources.resx больше не генерирует автоматический класс для строго типизированного доступа к ресурсам.
Уве Кейм,
1
Отметим, что я смог построить без ошибок после того, как цель проекта была изменена на 4.6. Однако мне нужно было установить этот пакет, чтобы устранить красные волнистые линии, появляющиеся из intellisense.
Дуг Морроу
7
Я использую это на веб-сайте WebForms (без файла проекта). К сожалению, простые изменения .aspx вызывают мучительно более медленную перекомпиляцию при повторном запросе страницы в браузере. Может быть, Roslyn теоретически быстрее для WebApplication (с файлом proj), но для WebSites он кажется значительно медленнее через csc в папке App_Code ... Кто-нибудь видит то же самое?
Стефан Ангел
4
Обратите внимание: для компиляции WebForms с C # 6 вам необходимо установить пакеты NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatformи их зависимостиMicrosoft.Net.Compilers
3
Обратите внимание, что если в вашем решении более одного веб-сайта - что-то не сработает, самый простой способ воспроизвести - создать пустое решение и начать добавлять в него проекты, после второго веб-сайта вы начнете получать «не удается найти csc.exe» ошибки
mac
67

Смотрите также этот блог из Сайед Ибрагим Хашими о том , как сделать это с помощью VS IDE.

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

Обновить.

В VS 2017 и 2019 эта функция перемещена в Сборка -> Компиляция ASP.NET . введите описание изображения здесь

Головокружение
источник
2
Вы знаете, где находится этот элемент в Visual Studio 2019?
Protector one
4
Сборка @ protector-one -> Компиляция ASP.NET
Vertigo
1
Я открыл более старый проект веб-сайта на основе папок в VS2019, и мне пришлось выбрать Файл> Сохранить проект, прежде чем эта опция появилась.
Коргалор
15

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

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

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

Джон Кроуэлл
источник
3
Просто закрытие и повторное открытие VS работало для меня (после Install-Package ...). Также нацелена на 4.6.
rwalter
1
это сработало для меня, также обратите внимание, что использование resharper может показывать ложные ошибки, мне потребовалось некоторое время, чтобы понять, почему я получаю «Невозможно разрешить символ» во всем представлении ...
Никлас
1
В моем случае мне просто пришлось подождать около 30 секунд после повторного открытия решения, и оно сработало без удаления binи obj.
Marc.2377
12

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

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

Добавьте эти элементы dom кода RTM в 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. *. Dll в каталог BIN.

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

Предложение решения 2 (Мартин)

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

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

  1. Файл / Новое / Веб-приложение ASP.NET
  2. Выберите шаблон «Веб-API» из шаблонов ASP.NET 4.5.2.
  3. Сделайте копию элемента system.codedom (и его содержимого) в web.config
  4. Используя Properties / TargetFramework, установите Target Framework на 4.6.
  5. Замените измененный элемент system.codedom в web.config копией, сделанной до изменения TargetFramework.
  6. Ударить 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>
Уве Кейм
источник
3
Что касается вашего решения 2, Microsoft.CSharp.CSharpCodeProviderверсия 4.0 означает, что он не использует Rosyln, поэтому не будет работать для C # 6.0.
jbtule
1
При переходе со старого решения убедитесь, что <LangVersion>в csprojфайле установлено значение 6. Это может вызвать проблемы, если это что-то еще.
Саул
7

Это не для проекта веб-сайта . Вот как вы это делаете для проекта ASP.NET MVC.

Вы можете переключать C # 6 в пользовательском интерфейсе Visual Studio. Это настолько простой вариант, что сначала стоит попробовать.

  1. Щелкните правой кнопкой мыши свой проект и выберите Свойства. .
  2. Нажмите на сборку вкладку .
  3. На вкладке сборки есть Advanced ... в самом низу кнопка
  4. Это открывает дополнительные настройки сборки, как показано ниже. Выберите C # 6.0.

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

Джесс
источник
@Manuzor, возможно, ты прав. Это было для проекта ASP.NET MVC.
Джесс
@ Учо, что не так? Это проект MVC? У вас есть опция Advanced в настройках сборки? Вам не хватает параметров для языковой версии C #? Вы установили версию и не можете использовать языковые функции?
Джесс
@Jess: Ах, наверное, работает. Я не заметил, что моя ошибка исходит от IntelliSense, а не от сборки.
Учо
Этот параметр, похоже, не применяется к коду на страницах aspx, например <% Eval(whatever) %>.
Крис
5

Вот как это выглядит в VS2017 с проектом веб-сайта:

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

b_levitt
источник
Я ценю работу по кадрированию @Uwe, но не думаю, что согласен с удалением остальной части верхней навигационной панели, поскольку теряется контекст того, где должен быть этот конкретный пункт меню.
b_levitt
1
Последняя версия VS 2017 переместила это в «Сборка -> Компиляция ASP.NET». См. Мой обновленный ответ.
Vertigo
Для типов проектов веб-сайтов я тестировал ответ @ b_levitt на VS2019. (1) Убедитесь, что у вас есть файл web.config. Если нет, добавьте один. (2) Сохраните решение, выбрав его в обозревателе решений и нажав [Ctrl] + [S]. (3) Выберите проект в обозревателе решений и измените Target Framework на 4.7.2 (4) Выберите параметр «Включить последнюю версию C # ...» в меню «Сборка»> «Компиляция ASP.NET».
Денни Джейкоб
2

Я получил эту ошибку после внесения НУЛЕВЫХ изменений в мой проект WebAPI. Я удалил и переустановил пакет NuGet DotNetCompilerPlatform, что устранило проблему.

Заходи
источник