Як використовувати C # 6 з типом проекту веб-сайту?


126

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

Тоді я очікував, що всі мої нові функції будуть доступні в моєму коді за файлами.

На жаль, я отримую помилки типу:

Помилка CS8026: Особливість "властивість, виражена експресією" недоступна в C # 5. Будь ласка, використовуйте мову версії 6 або новішої.

або наприклад:

Помилка CS8026: Функція "інтерпольовані рядки" недоступна в C # 5. Будь ласка, використовуйте мову версії 6 або новішої.

Я зробив швидку перевірку Google і знайшов хлопця, який розміщував деякі коментарі в публікації в блозі ScottGu (пошук "8026" на сторінці).

Оскільки я не розумію його рішення, плюс я хочу, щоб рішення було більш видимим, я створив цю публікацію ТА.

Моє запитання:

Як я можу у проекту Visual Studio 2015 типу веб-сайту (тобто не веб-додатку ) розпізнати функції C # 6?


1
Ви спробували додати елементи ww config, які він згадав у коментарі?
scheien

Я збираюся це зробити, але це здається мені справді дивним , тому я очікував ще чистішого рішення.
Uwe Keim

5
Звичайно, інший варіант - припинити використання цих проектів на веб-сайті та використовувати натомість проекти веб-додатків.
Джон Сондерс

1
@JohnSaunders Я люблю , щоб зробити це. Оскільки міграція - це ручне завдання, я побоююся часу, який знадобиться, і всіх помилок, які я введу під час міграції. Зробили це кілька разів для менших проектів. Завжди було клопоту ...
Уве Кейм

1
Радий, що ви це врахували. Цей коментар здебільшого стосувався інших читачів, які могли подумати, що проект "веб-сайту" звучить як те, що вони хочуть.
Джон Сондерс

Відповіді:


118

Я перевірив це на ASP.NET MVC 5 (перевірено 5.2.3), і ваш пробіг може відрізнятися від інших веб-рамок, але вам просто потрібно додати Roslyn CodeDOM | NuGet пакет

Провайдери CodeDOM для .NET Compiler ...

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

Якщо вона все ще відсутня. Спробуйте додати себе.


1
Це працює як очікувалося. C # 6 зараз доступний. Недолік - це те, що мій App_GlobalResources / Resources.resx більше не генерує автоклас для сильно набраного доступу до ресурсів.
Уве Кейм

1
На замітку, мені вдалося створити без помилок після зміни цілі проекту на 4,6. Однак мені потрібно було встановити цей пакет, щоб вирішити червоні викрутки, що з’являються з intellisense.
Дуг Морроу

7
Я використовую це у веб-сайті WebForms (без файлу проекту). На жаль, прості зміни. Можливо, Рослін теоретично швидше для WebApplication (з файлом proj), але для веб-сайтів це здається значно повільнішим через 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 Update 1 ми включили нову функцію для спрощення цього. Якщо у вас відкрите рішення, яке має принаймні один веб-проект, націлений на .NET 4.5+ і не має пакета DotNetCompilerPlatform NuGet в меню проекту, ви побачите нову опцію, з'явиться Включити C # 6 / VB 14.
введіть тут опис зображення

Оновлення.

У VS 2017 та 2019 році ця функція переміщена до збірки -> ASP.NET Compilation . введіть тут опис зображення


2
Чи знаєте ви, де цей предмет знаходиться у Visual Studio 2019?
Захисник один

4
@ protector-one Build -> Компіляція ASP.NET
Вертиго,

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 може показати помилкові помилки, знадобилось мені час, щоб зрозуміти, чому я отримую "Неможливо вирішити символ" у всьому перегляді ...
Niklas

1
У моєму випадку мені довелося зачекати приблизно 30 секунд після повторного відкриття рішення, і воно спрацювало, не видаляючи binта obj.
Марк.2377,

12

Можливі рішення, взяті з коментарів до публікації в блозі ScottGu (пошук "8026" на сторінці):

Пропозиція рішення 1 (Девід Тейлор)

Додайте ці елементи елемента 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>

Потім додайте матеріали dll Roslyn і Microsoft.CodeDom.Providers. *. У свій каталог 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. За допомогою властивостей / TargetFramework встановіть цільову рамку на 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. Вкладка збірки має розширений ... внизу розміщена кнопка
  4. Це відкриває розширені налаштування збірки, як показано нижче. Виберіть C # 6.0.

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


@Manuzor ви можете мати рацію. Це було для проекту ASP.NET MVC.
Джесс

@Ucho що не так? Це проект MVC? Чи є в налаштуваннях збірки опція Advanced? Чи відсутні у вас варіанти для версії мови C #? Ви встановили версію та не можете використовувати мовні функції?
Джесс

@Jess: Ах, мабуть, працює. Я не помітив, що моя помилка приходить від IntelliSense, а не від збірки.
Учо

Здається, цей параметр не застосовується до коду на сторінках aspx, наприклад <% Eval(whatever) %>.
Кріс

5

Ось як це виглядає у VS2017 з проектом веб-сайту:

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


Я ціную роботу з обрізанням @Uwe, але не думаю, що я згоден з видаленням решти верхнього nav, оскільки контекст втрачається там, де має бути цей конкретний пункт меню.
b_levitt

1
Остання версія VS 2017 перенесла це на "Збірка -> Компіляція ASP.NET". Дивіться мою оновлену відповідь.
Вертиго

Для типів проектів веб-сайтів я перевірив відповідь @ b_levitt на VS2019. (1) Переконайтеся, що у вас є web.config. Якщо не додати. (2) Збережіть рішення, вибравши його в Провіднику рішень і видавши [Ctrl] + [S]. (3) Виберіть проект у Провіднику рішень та змініть цільову рамку на 4.7.2 (4) Виберіть у меню «Збір> ASP.NET Compilation» пункт «Увімкнути останню C # ...».
Денні Яків

2

Я отримав цю помилку після внесення змін ZERO до свого проекту WebAPI. Я видалив нут-пакет DotNetCompilerPlatform і перевстановив, що вирішило проблему.

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