Làm thế nào để sử dụng C # 6 với loại dự án Trang Web?


126

Đã cập nhật loại dự án Trang web hiện có Visual Studio 2015, tôi đã thay đổi Khung thành 4.6.

Sau đó, tôi mong đợi có tất cả các tính năng mới đó trong mã của tôi đằng sau tệp.

Rất tiếc, tôi đang gặp các lỗi như:

Lỗi CS8026: Tính năng 'thuộc tính thể hiện biểu thức' không khả dụng trong C # 5. Vui lòng sử dụng phiên bản ngôn ngữ 6 trở lên.

hoặc ví dụ:

Lỗi CS8026: Tính năng 'chuỗi nội suy' không khả dụng trong C # 5. Vui lòng sử dụng phiên bản ngôn ngữ 6 trở lên.

Tôi đã kiểm tra nhanh trên Google và thấy một anh chàng đăng một số bình luận trong một bài đăng trên blog của ScottGu (tìm kiếm "8026" trên trang).

Vì tôi không hiểu giải pháp của anh ấy, cộng với tôi muốn giải pháp hiển thị rõ ràng hơn, tôi đã tạo bài đăng SO này.

Câu hỏi của tôi:

Làm thế nào tôi có thể có một dự án Visual Studio 2015 thuộc loại Trang web (tức là không phải Ứng dụng web ) để nhận ra các tính năng của C # 6?


1
Bạn đã thử thêm các yếu tố cấu hình thw mà anh ấy đề cập trong nhận xét chưa?
scheien

Tôi sắp làm điều đó, nhưng nó trông thực sự lạ đối với tôi , vì vậy tôi đã mong đợi một số giải pháp sạch hơn.
Uwe Keim,

5
Tất nhiên, tùy chọn khác là ngừng sử dụng các "dự án" trang web đó và thay vào đó sử dụng Dự án ứng dụng web.
John Saunders

1
@JohnSaunders Tôi rất thích làm điều đó. Vì quá trình di chuyển là một công việc thủ công, tôi sợ sẽ mất nhiều thời gian và tất cả các lỗi tôi sẽ giới thiệu trong quá trình di chuyển. Đã thực hiện một vài lần cho các dự án nhỏ hơn. Luôn luôn là một rắc rối ...
Uwe Keim

1
Rất vui vì bạn đã xem xét nó. Nhận xét chủ yếu dành cho những độc giả khác, những người có thể nghĩ rằng một dự án "trang web" có vẻ giống như những gì họ muốn.
John Saunders

Câu trả lời:


118

Tôi đã thử nghiệm điều này với ASP.NET MVC 5 (đã thử nghiệm 5.2.3) và quãng đường của bạn có thể thay đổi với các khuôn khổ web khác, nhưng bạn chỉ cần thêm Roslyn CodeDOM | Gói NuGet

Nhà cung cấp CodeDOM cho Trình biên dịch .NET ...

Các nhà cung cấp CodeDOM thay thế sử dụng trình biên dịch .NET Compiler Platform ("Roslyn") mới làm API dịch vụ. Điều này cung cấp hỗ trợ cho các tính năng ngôn ngữ mới trong các hệ thống sử dụng CodeDOM (ví dụ biên dịch thời gian chạy ASP.NET) cũng như cải thiện hiệu suất biên dịch của các hệ thống này.

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

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

Gói NuGet sẽ thêm các tệp DLL và thêm phần sau vào web.config của bạn.

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

Nếu nó vẫn còn thiếu. Hãy thử thêm chính bạn.


1
Điều này hoạt động như mong đợi. C # 6 hiện đã có. Hạn chế là App_GlobalResources / Resources.resx của tôi không tạo lớp tự động để truy cập mạnh vào tài nguyên nữa.
Uwe Keim

1
Như một lưu ý, tôi có thể xây dựng mà không có lỗi sau khi mục tiêu dự án được thay đổi thành 4.6. Tuy nhiên, tôi cần cài đặt gói này để giải quyết các hình vuông màu đỏ hiển thị từ intellisense.
Doug Morrow

7
Tôi đang sử dụng cái này trong một WebSite WebForms (không có tệp dự án). Đáng buồn thay, các thay đổi .aspx đơn giản kích hoạt quá trình biên dịch lại chậm hơn đáng kể khi yêu cầu lại trang trong trình duyệt. Có thể về mặt lý thuyết Roslyn nhanh hơn đối với WebApplication (với tệp proj), nhưng đối với WebSites thì có vẻ chậm hơn đáng kể thông qua csc trong thư mục App_Code ... Có ai thấy điều tương tự không?
Stefan Anghel

4
Lưu ý, đối với WebForms để biên dịch với C # 6 bạn cần phải cài đặt các gói NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatformvà sự phụ thuộc của nóMicrosoft.Net.Compilers

3
Lưu ý rằng nếu bạn có nhiều hơn một trang web trong giải pháp của mình - mọi thứ sẽ không hoạt động, cách dễ nhất để tái tạo là tạo giải pháp trống và bắt đầu thêm các dự án vào đó, sau trang web thứ hai - bạn sẽ bắt đầu nhận được "không thể tìm thấy csc.exe" lỗi
mac

67

Xem thêm bài đăng trên blog này của Sayed Ibrahim Hashimi về cách thực hiện điều này thông qua VS IDE.

Trong Visual Studio 2015 Update 1, chúng tôi đã đưa vào một tính năng mới để đơn giản hóa việc này. Khi bạn mở một giải pháp có ít nhất một dự án web đang nhắm mục tiêu .NET 4.5+ và không có gói DotNetCompilerPlatform NuGet trong menu Dự án, bạn sẽ thấy một tùy chọn mới, Bật C # 6 / VB 14 xuất hiện.
nhập mô tả hình ảnh ở đây

Cập nhật.

VS 2017 và 2019 đã chuyển tính năng này sang Build -> ASP.NET Compilation . nhập mô tả hình ảnh ở đây


2
Bạn có biết mục này ở đâu trong Visual Studio 2019 không?
Người bảo vệ một

4
@ protector-one Build -> ASP.NET Compilation
Vertigo

1
Tôi đã mở một dự án trang web dựa trên thư mục cũ hơn trong VS2019 và phải Tệp> Lưu dự án trước khi tùy chọn đó hiển thị.
Corgalore

15

Tôi đã cài đặt DotNetCompilerPlatform như @jbtule đề xuất nhưng vẫn gặp lỗi tương tự.

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

Tôi đã đóng giải pháp, xóa thư mục bin và obj, sau đó mở giải pháp và xây dựng lại. Bây giờ các tính năng C # 6 hoạt động.


3
Chỉ cần đóng và mở lại VS đã làm việc cho tôi (sau Install-Package ...). Cũng nhắm mục tiêu 4.6.
bộ

1
này làm việc cho tôi, cũng nhận thấy sử dụng resharper có thể hiển thị u lỗi sai, đã cho tôi một thời gian để tìm ra lý do tại sao tôi nhận được "Unable to biểu tượng quyết tâm" khắp nơi trên quan điểm ...
Niklas

1
Trong trường hợp của tôi, tôi chỉ phải đợi khoảng 30 giây sau khi mở lại giải pháp và nó hoạt động mà không cần phải xóa binobj.
Marc.2377 23/04 '19

12

Các giải pháp khả thi, được lấy từ các nhận xét trên bài đăng trên blog của ScottGu (tìm kiếm "8026" trên trang):

Đề xuất giải pháp 1 (David Taylor)

Thêm các phần tử dom mã RTM này vào 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>

Sau đó thêm Roslyn và Microsoft.CodeDom.Providers. *. Dll vào thư mục BIN của bạn.

Nó đủ dễ dàng để thiết lập, nhưng thật kỳ lạ đối với tôi là mẫu mặc định không được thiết lập cho nó nếu bạn chọn .NET 4.6 khi tạo một "Trang web" mới trong VS 2015 RTM.

Đề xuất giải pháp 2 (Martin)

Ngoài nhận xét của David Taylor ở trên, có vẻ như cài đặt system.codedom là chính xác khi một Ứng dụng web được tạo với TargetFramework làm v4.5.2 mặc định. Thay đổi TargetFramework thành v4.6 dường như để sửa đổi cài đặt trình biên dịch cho CSharp, theo cách gây ra sự cố.

Cách giải quyết của tôi như sau:

  1. Tệp / Mới / Ứng dụng Web ASP.NET
  2. Chọn mẫu "API Web" từ Mẫu ASP.NET 4.5.2
  3. Sao chép phần tử system.codedom (và nội dung của nó) trong web.config
  4. Sử dụng Thuộc tính / TargetFramework, đặt Khung mục tiêu thành 4,6
  5. Thay thế phần tử system.codedom đã sửa đổi trong web.config bằng bản sao được chụp trước khi thay đổi TargetFramework
  6. Đánh F5

Trang chủ sẽ tải như mong đợi.

Để biết thông tin, nội dung system.codedom ngay sau khi thay đổi TargetFramework thành v4.6. như sau (lưu ý sử dụng Loại "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
Liên quan đến giải pháp 2 của bạn, Microsoft.CSharp.CSharpCodeProviderphiên bản 4.0 có nghĩa là nó không sử dụng Rosyln, Do đó sẽ không hoạt động cho C # 6.0.
jbtule

1
Khi di chuyển từ một giải pháp cũ hơn, hãy đảm bảo rằng <LangVersion>trong csprojtệp bằng 6. Nó có thể gây ra vấn đề nếu là thứ khác.
Saul

7

Điều này không dành cho một dự án trang web . Đây là cách bạn thực hiện cho một dự án ASP.NET MVC.

Bạn có thể chuyển đổi C # 6 trong giao diện người dùng Visual Studio. Đây là một lựa chọn dễ dàng, nó đáng để thử đầu tiên.

  1. Nhấp chuột phải vào dự án của bạn và chọn Thuộc tính .
  2. Nhấp vào tab Xây dựng .
  3. Tab xây dựng có nút Nâng cao ... ở dưới cùng.
  4. Thao tác này sẽ mở ra Cài đặt bản dựng nâng cao như được hiển thị bên dưới. Chọn C # 6.0.

nhập mô tả hình ảnh ở đây


@Manuzor bạn có thể đúng. Đây là dự án ASP.NET MVC.
Jess

@Ucho bị sao vậy? Nó có phải là một dự án MVC? Bạn có tùy chọn Nâng cao trong cài đặt bản dựng không? Bạn có thiếu tùy chọn cho phiên bản ngôn ngữ C # không? Bạn đã đặt phiên bản và không thể sử dụng các tính năng ngôn ngữ?
Jess

@Jess: Ah, có lẽ đang hoạt động. Tôi không nhận thấy rằng lỗi của tôi đến từ IntelliSense không phải từ bản dựng.
Ucho

Cài đặt này dường như không áp dụng cho mã trong các trang aspx, ví dụ <% Eval(whatever) %>.
Chris

5

Đây là những gì nó trông giống như trong VS2017 với một dự án trang web:

nhập mô tả hình ảnh ở đây


Tôi đánh giá cao công việc cắt @Uwe nhưng tôi không nghĩ rằng tôi đồng ý với việc xóa phần còn lại của điều hướng trên cùng vì ngữ cảnh bị mất cho vị trí của mục menu cụ thể này.
b_levitt

1
VS 2017 mới nhất đã chuyển nó thành 'Build -> ASP.NET Compilation'. Xem câu trả lời cập nhật của tôi.
Vertigo

Đối với các loại dự án trang web, tôi đã thử nghiệm câu trả lời của @ b_levitt trên VS2019. (1) Đảm bảo bạn có web.config. Nếu không thêm một. (2) Lưu giải pháp bằng cách chọn nó trên Trình khám phá giải pháp và phát hành [Ctrl] + [S]. (3) Chọn dự án trên Trình khám phá giải pháp và thay đổi Khung mục tiêu thành 4.7.2 (4) Chọn tùy chọn "Bật C # ... mới nhất" từ menu Xây dựng> Biên dịch ASP.NET.
Denny Jacob

2

Tôi nhận được lỗi này sau khi thực hiện các thay đổi ZERO đối với dự án WebAPI của tôi. Tôi đã gỡ cài đặt gói nuget DotNetCompilerPlatform và cài đặt lại, điều này đã khắc phục sự cố.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.