WebサイトプロジェクトタイプでC#6を使用する方法


126

既存のWebサイトを更新しましたプロジェクトタイプVisual Studio 2015を、フレームワークを4.6に変更しました。

次に、コードビハインドファイルでこれらの新機能をすべて利用できるようにする予定でした。

残念ながら、次のようなエラーが発生します。

エラーCS8026:機能 'expression-bodied property'はC#5では使用できません。言語バージョン6以降を使用してください。

または例:

エラーCS8026:機能「補間された文字列」はC#5では使用できません。言語バージョン6以降を使用してください。

私は簡単なGoogleチェックを行ったところ ScottGuのブログ投稿(ページで「8026」を検索)にコメント投稿している男を見つけまし

私は彼のソリューションを理解していないため、さらにソリューションをもっと見やすくしたいので、このSO投稿を作成しました。

私の質問:

C#6の機能を認識するために、タイプがWebサイト(つまりWebアプリケーションではない)のVisual Studio 2015プロジェクトを作成するにはどうすればよいですか?


1
彼がコメントで言及した構成要素を追加してみましたか?
シェーン2015

私はそれをやろうとしているが、それは私には本当に奇妙見えるので、もっときれいな解決策を期待していた。
Uwe Keim 2015

5
もちろん、他のオプションは、それらのWebサイト「プロジェクト」の使用を停止し、代わりにWebアプリケーションプロジェクトを使用することです。
John Saunders

1
@JohnSaunders私は考え愛するそれを行います。移行は手動のタスクなので、移行にかかる時間と、移行中に発生するすべてのエラーが心配です。小さなプロジェクトの場合は数回やりました。いつも面倒だった...
Uwe Keim 2015

1
あなたがそれを検討してよかったです。コメントは主に、「ウェブサイト」プロジェクトが彼らが望むもののように聞こえると思うかもしれない他の読者のためのものでした。
John Saunders

回答:


118

私はこれをASP.NET MVC 5(5.2.3でテスト済み)でテストしましたが、他のWebフレームワークではマイレージが異なる場合がありますが、Roslyn CodeDOM を追加するだけです。NuGetパッケージ

.NETコンパイラ用のCodeDOMプロバイダー...

新しい.NETコンパイラプラットフォーム( "Roslyn")コンパイラをサービスAPIとして使用する置換CodeDOMプロバイダー。これにより、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が、強く型付けされたリソースにアクセスするための自動クラスを生成しないことです。
Uwe Keim 2015

1
メモとして、プロジェクトのターゲットを4.6に変更した後、エラーなしでビルドできました。しかし、私はこのパッケージをインストールして、インテリセンスから現れる赤い波線を解決する必要がありました。
Doug Morrow

7
これをWebForms WebSiteで使用しています(プロジェクトファイルなし)。悲しいことに、単純な.aspxの変更により、ブラウザーでページを再要求するときに、再コンパイルが非常に遅くなります。たぶん、Roslynは理論的にはWebアプリケーション(projファイルを使用)の方が高速ですが、WebSitesの場合、App_Codeフォルダーのcscを使用すると大幅に遅くなります...同じものを見ている人はいますか?
Stefan Anghel、2016

4
WebFormsをC#6でコンパイルするには、NuGetパッケージMicrosoft.CodeDom.Providers.DotNetCompilerPlatformとその依存関係をインストールする必要がありますMicrosoft.Net.Compilers

3
ソリューションに複数のWebサイトがある場合-うまくいかない場合、再現する最も簡単な方法は、空のソリューションを作成し、2番目のWebサイトの後にプロジェクトを追加することです。 "csc.exeが見つかりません"が表示されます。エラー
Mac

67

VS IDEでこれを行う方法については、Sayed Ibrahim Hashimiによるこのブログ投稿も参照してください。

Visual Studio 2015 Update 1には、これを簡素化する新機能が含まれています。.NET 4.5+をターゲットとするWebプロジェクトが1つ以上あり、[プロジェクト]メニューにDotNetCompilerPlatform NuGetパッケージがないソリューションを開いている場合、新しいオプションが表示され、[C#6 / VB 14を有効にする]が表示されます。
ここに画像の説明を入力してください

更新。

VS 2017および2019では、この機能が[ビルド]-> [ASP.NETコンパイル]に移動しました。 ここに画像の説明を入力してください


2
このアイテムがVisual Studio 2019のどこにあるか知っていますか?
プロテクター1

4
@ protector-one Build-> ASP.NETコンパイル
Vertigo

1
VS2019で古いフォルダーベースのWebサイトプロジェクトを開き、そのオプションが表示される前に、[ファイル]> [プロジェクトを保存]する必要がありました。
Corgalore

15

@jbtuleの提案に従ってDotNetCompilerPlatformをインストールしましたが、それでも同じエラーが発生していました。

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

ソリューションを閉じ、binフォルダーとobjフォルダーを削除してから、ソリューションを開いて再構築しました。これでC#6の機能が動作します。


3
VSを閉じて再び開くだけでうまくいきました(後Install-Package ...)。4.6も対象としています。
rwalter 2015

1
これは私のために働いた、また、ReSharperのをuに偽のエラーが表示される場合があります使用して気づく、私はすべてのビューの上に...「解決シンボルにできません」を取得する理由を把握する私にしばらく時間がかかった
ニクラス

1
私の場合、ソリューションを再び開いてから約30秒待つ必要があり、削除binやを行わなくても機能しましたobj
Marc.2377

12

ScottGuのブログ投稿のコメントから取られ可能な解決策(ページで「8026」を検索):

ソリューションの提案1(David Taylor)

これらのRTMコードdom要素を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ディレクトリに追加します。

設定は簡単ですが、VS 2015 RTMで新しい「Webサイト」を作成するときに.NET 4.6を選択した場合、デフォルトのテンプレートが設定されていなかったのは不思議でした。

解決策の提案2(Martin)

上記のDavid Taylorのコメントに加えて、TargetFrameworkをデフォルトのv4.5.2としてWebアプリを作成すると、system.codedom設定が正しいようです。TargetFrameworkをv4.6に変更すると、CSharpのコンパイラ設定が変更され、問題が発生する可能性があります。

私の回避策は次のとおりです。

  1. ファイル/新規/ASP.NET Webアプリケーション
  2. ASP.NET 4.5.2テンプレートから「Web API」テンプレートを選択します
  3. web.configのsystem.codedom要素(お​​よびその内容)のコピーを取得します
  4. Properties / TargetFrameworkを使用して、Target Frameworkを4.6に設定します
  5. web.configの変更されたsystem.codedom要素を、TargetFrameworkを変更する前に取得したコピーで置き換えます。
  6. ヒット F5

ホームページは期待どおりに読み込まれるはずです。

参考までに、TargetFrameworkをv4.6に変更した直後のsystem.codedomの内容。次のとおりでした(Type "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。それが他のものである場合、問題を引き起こす可能性があります。
2016年

7

これはWebサイトプロジェクト用ではありません。これは、ASP.NET MVCプロジェクトで行う方法です。

Visual Studio UIでC#6を切り替えることができます。これはとても簡単なオプションです。最初に試す価値があります。

  1. プロジェクトを右クリックし、[ プロパティ ]を選択します
  2. [ ビルド ]タブをクリックします。
  3. ビルドタブには詳細...非常に下部にあるボタンを押します。
  4. これにより、以下に示すように、ビルド詳細設定が開きます。C#6.0を選択します。

ここに画像の説明を入力してください


@Manuzorあなたは正しいかもしれません。これはASP.NET MVCプロジェクト用です。
ジェス

@Ucho何が悪いの?MVCプロジェクトですか?ビルド設定に詳細オプションはありますか?C#言語バージョンのオプションがありませんか?バージョンを設定しましたが、言語機能を使用できませんでしたか?
Jess

@ジェス:ああ、おそらく働いている。私のエラーがビルドではなくIntelliSenseに起因していることに気付きませんでした。
ウチョ

この設定はaspxページのコードには適用されないようです<% Eval(whatever) %>
Chris

5

VS2017でのWebサイトプロジェクトの表示は次のとおりです。

ここに画像の説明を入力してください


クロップジョブ@Uweに感謝しますが、この特定のメニュー項目があるべき場所のコンテキストが失われるため、上位ナビゲーションの残りを削除することに同意しません。
b_levitt

1
最新のVS 2017はこれを「ビルド-> ASP.NETコンパイル」に移動しました。私の更新された答えを見てください。
めまい

Webサイトのプロジェクトタイプについては、VS2019で@b_levittの回答をテストしました。(1)web.configがあることを確認します。ない場合は追加します。(2)ソリューションエクスプローラーでソリューションを選択し、[Ctrl] + [S]を発行してソリューションを保存します。(3)ソリューションエクスプローラーでプロジェクトを選択し、ターゲットフレームワークを4.7.2に変更します。(4)メニューの[ビルド]> [ASP.NETコンパイル]から[最新のC#を有効にする...]オプションを選択します。
デニージェイコブ

2

WebAPIプロジェクトにゼロの変更を加えた後、このエラーを受け取りました。DotNetCompilerPlatform nugetパッケージをアンインストールして再インストールしたところ、問題が解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.