Bagaimana cara menggunakan C # 6 dengan jenis proyek Situs Web?

126

Memperbarui jenis proyek situs Web yang sudah ada Visual Studio 2015, saya mengubah kerangka kerja menjadi 4.6.

Saya kemudian berharap memiliki semua fitur baru yang tersedia dalam kode saya di belakang file.

Sayangnya saya mendapatkan kesalahan seperti:

Kesalahan CS8026: Fitur 'properti bertubuh ekspresi' tidak tersedia di C # 5. Harap gunakan bahasa versi 6 atau lebih tinggi.

atau misalnya:

Kesalahan CS8026: Fitur 'string interpolasi' tidak tersedia di C # 5. Harap gunakan bahasa versi 6 atau lebih tinggi.

Saya melakukan pemeriksaan Google dengan cepat dan menemukan seorang pria memposting beberapa komentar di posting blog ScottGu (cari "8026" di halaman).

Karena saya tidak mengerti solusinya, ditambah saya ingin solusi lebih terlihat, saya telah membuat posting SO ini.

Pertanyaan saya:

Bagaimana saya bisa memiliki proyek Visual Studio 2015 jenis Situs Web (yaitu bukan Aplikasi Web ) untuk mengenali fitur C # 6?

Uwe Keim
sumber
1
Sudahkah Anda mencoba menambahkan elemen konfigurasi yang dia sebutkan di komentar?
scheien
Saya akan melakukan itu, tetapi tampaknya sangat aneh bagi saya , jadi saya mengharapkan solusi yang lebih bersih.
Uwe Keim
5
Tentu saja, pilihan lainnya adalah berhenti menggunakan "proyek" situs web tersebut, dan sebagai gantinya gunakan Proyek Aplikasi Web.
John Saunders
1
@JohnSaunders Saya akan senang melakukan itu. Karena migrasi adalah tugas manual, saya khawatir waktu yang dibutuhkan dan semua kesalahan yang akan saya perkenalkan selama migrasi. Lakukan beberapa kali untuk proyek yang lebih kecil. Selalu merepotkan ...
Uwe Keim
1
Senang Anda telah mempertimbangkannya. Komentar tersebut sebagian besar ditujukan untuk pembaca lain yang mungkin berpikir bahwa proyek "situs web" terdengar seperti yang mereka inginkan.
John Saunders

Jawaban:

118

Saya telah menguji ini dengan ASP.NET MVC 5 (diuji 5.2.3), dan jarak tempuh Anda mungkin berbeda dengan kerangka kerja web lain, tetapi Anda hanya perlu menambahkan Roslyn CodeDOM | Paket NuGet

Penyedia CodeDOM untuk .NET Compiler ...

Penyedia CodeDOM pengganti yang menggunakan kompilator .NET Compiler Platform ("Roslyn") baru sebagai API layanan. Ini memberikan dukungan untuk fitur bahasa baru dalam sistem yang menggunakan CodeDOM (misalnya, kompilasi runtime ASP.NET) serta meningkatkan kinerja kompilasi sistem ini.

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

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

Paket NuGet harus menambahkan file DLL dan menambahkan berikut ini ke web.config Anda.

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

Jika masih hilang. Coba tambahkan diri Anda.

jbtule.dll
sumber
1
Ini bekerja seperti yang diharapkan. C # 6 sekarang tersedia. Kekurangannya adalah App_GlobalResources / Resources.resx saya tidak menghasilkan kelas otomatis untuk mengakses sumber daya yang diketik dengan kuat lagi.
Uwe Keim
1
Sebagai catatan, saya dapat membangun tanpa kesalahan setelah target proyek diubah menjadi 4.6. Namun, saya perlu menginstal paket ini untuk menyelesaikan coretan merah yang muncul dari Intellisense.
Doug Morrow
7
Saya menggunakan ini di WebForms WebSite (tidak ada file proyek). Sayangnya, perubahan sederhana .aspx memicu kompilasi ulang yang sangat lambat saat meminta ulang halaman di browser. Mungkin Roslyn secara teoritis lebih cepat untuk Aplikasi Web (dengan file proj), tetapi untuk WebSites tampaknya jauh lebih lambat melalui csc di folder App_Code ... Ada yang melihat hal yang sama?
Stefan Anghel
4
Catatan, untuk WebForms untuk dikompilasi dengan C # 6 Anda perlu menginstal paket NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatformdan ketergantungannyaMicrosoft.Net.Compilers
3
Perhatikan bahwa jika Anda memiliki lebih dari satu situs web dalam solusi Anda - semuanya tidak berfungsi, cara termudah untuk mereproduksi adalah membuat solusi kosong dan mulai menambahkan proyek ke dalamnya, setelah situs web kedua - Anda akan mulai menerima "tidak dapat menemukan csc.exe" kesalahan
mac
67

Lihat juga entri blog dari Sayed Ibrahim Hashimi ini tentang cara melakukan ini melalui VS IDE.

Dalam Visual Studio 2015 Pembaruan 1 kami telah menyertakan fitur baru untuk menyederhanakan ini. Ketika Anda memiliki solusi terbuka yang memiliki setidaknya satu proyek web yang menargetkan .NET 4.5+ dan tidak memiliki paket DotNetCompilerPlatform NuGet di menu Proyek, Anda akan melihat opsi baru, Aktifkan C # 6 / VB 14 muncul.
masukkan deskripsi gambar di sini

Memperbarui.

VS 2017 dan 2019 memiliki fitur ini dipindahkan ke Build -> ASP.NET Compilation . masukkan deskripsi gambar di sini

Vertigo
sumber
2
Tahukah Anda di mana item ini ada di Visual Studio 2019?
Pelindung satu
4
@ protector-one Build -> Kompilasi ASP.NET
Vertigo
1
Saya membuka proyek situs web berbasis folder yang lebih lama di VS2019 dan harus File> Simpan proyek sebelum opsi itu muncul.
Corgalore
15

Saya menginstal DotNetCompilerPlatform seperti yang disarankan @jbtule, tetapi masih mendapatkan kesalahan yang sama.

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

Saya menutup solusi, menghapus folder bin dan obj, kemudian membuka solusi dan membangun kembali. Sekarang fitur C # 6 berfungsi.

Jon Crowell
sumber
3
Hanya menutup dan membuka kembali VS bekerja untuk saya (setelah Install-Package ...). Juga menargetkan 4.6.
rwalter
1
ini berhasil untuk saya, juga pemberitahuan menggunakan resharper mungkin menunjukkan kesalahan palsu Anda, butuh beberapa saat untuk mencari tahu mengapa saya mendapatkan "Tidak dapat menyelesaikan simbol" di seluruh tampilan ...
Niklas
1
Dalam kasus saya, saya hanya harus menunggu sekitar 30 detik setelah membuka kembali solusi dan berhasil tanpa harus menghapus bindan obj.
Marc. 2377
12

Solusi yang memungkinkan, diambil dari komentar di posting blog ScottGu (cari "8026" di halaman):

Saran solusi 1 (David Taylor)

Tambahkan elemen dom kode RTM ini ke 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>

Kemudian tambahkan hal-hal Roslyn dan Microsoft.CodeDom.Providers. *. Dll ke dalam direktori BIN Anda.

Ini cukup mudah untuk mengatur, tetapi aneh bagi saya bahwa template default tidak diatur untuk itu jika Anda memilih .NET 4.6 saat membuat "Situs Web" baru di VS 2015 RTM.

Saran solusi 2 (Martin)

Lebih jauh dari komentar David Taylor di atas, sepertinya pengaturan system.codedom sudah benar ketika Aplikasi Web dibuat dengan TargetFramework sebagai v4.5.2 default. Mengubah TargetFramework ke v4.6 tampaknya mengubah pengaturan kompilator untuk CSharp, dengan cara yang menyebabkan masalah.

Solusi saya adalah sebagai berikut:

  1. File / Baru / Aplikasi Web ASP.NET
  2. Pilih template "Web API" dari Template ASP.NET 4.5.2
  3. Ambil salinan elemen system.codedom (dan isinya) di web.config
  4. Menggunakan Properties / TargetFramework, atur Target Framework ke 4.6
  5. Ganti elemen system.codedom yang dimodifikasi di web.config dengan salinan yang diambil sebelum mengubah TargetFramework
  6. Memukul F5

Halaman Beranda harus dimuat seperti yang diharapkan.

Untuk info, isi system.codedom segera setelah mengubah TargetFramework ke v4.6. adalah sebagai berikut (perhatikan penggunaan 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>
Uwe Keim
sumber
3
Berkenaan dengan solusi 2 Anda, Microsoft.CSharp.CSharpCodeProviderversi 4.0 berarti tidak menggunakan Rosyln, Jadi tidak akan berfungsi untuk C # 6.0.
jbtule
1
Ketika migrasi dari solusi yang lebih tua, pastikan <LangVersion>dalam csprojberkas sama dengan 6. Ini dapat menyebabkan masalah jika itu adalah hal lain.
Saul
7

Ini bukan untuk Proyek Situs Web . Ini adalah bagaimana Anda melakukannya untuk proyek ASP.NET MVC.

Anda dapat mengaktifkan C # 6 di UI Visual Studio. Ini adalah opsi yang mudah, patut dicoba terlebih dahulu.

  1. Klik kanan proyek Anda dan pilih Properties .
  2. Klik Build tab .
  3. Tab build memiliki Advanced ... tombol di bagian paling bawah.
  4. Ini membuka Pengaturan Build Lanjutan seperti yang ditunjukkan di bawah ini. Pilih C # 6.0.

masukkan deskripsi gambar di sini

Jess
sumber
@ Manuzor Anda mungkin benar. Ini untuk proyek ASP.NET MVC.
Jess
@Ucho apa yang salah? Apakah ini proyek MVC? Apakah Anda memiliki opsi Lanjutan dalam pengaturan build? Apakah Anda kehilangan opsi untuk versi bahasa C #? Apakah Anda menyetel versinya dan tidak dapat menggunakan fitur bahasa?
Jess
@ Jess: Ah, mungkin bekerja. Saya tidak melihat bahwa kesalahan saya berasal dari IntelliSense bukan dari build.
Ucho
Pengaturan ini sepertinya tidak berlaku untuk kode di halaman aspx, mis <% Eval(whatever) %>.
Chris
5

Inilah tampilannya di VS2017 dengan proyek situs web:

masukkan deskripsi gambar di sini

b_levitt
sumber
Saya menghargai pekerjaan memotong @Uwe tetapi saya rasa saya tidak setuju dengan menghapus sisa navigasi teratas karena konteks hilang untuk di mana item menu khusus ini seharusnya.
b_levitt
1
VS 2017 terbaru telah memindahkan ini ke 'Build -> ASP.NET Compilation'. Lihat jawaban terbaru saya.
Vertigo
Untuk jenis proyek situs web saya menguji jawaban @ b_levitt di VS2019. (1) Pastikan Anda memiliki web.config. Jika tidak tambahkan. (2) Simpan solusi dengan memilihnya pada Penjelajah Solusi dan mengeluarkan [Ctrl] + [S]. (3) Pilih proyek pada Solution Explorer dan ubah Target Framework menjadi 4.7.2 (4) Pilih opsi "Enable latest C # ..." dari menu Build> ASP.NET Compilation.
Denny Jacob
2

Saya menerima kesalahan ini setelah melakukan NOL perubahan pada proyek WebAPI saya. Saya menghapus paket nuget DotNetCompilerPlatform dan menginstal ulang, yang memperbaiki masalah.

Silahkan masuk
sumber