The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

ASP.NET MVC 5 專案如何使用 C# 6.0 進行開發

由於 C# 6.0 採用全新 Roslyn 編譯器平台,想必有不少人躍躍欲試,基本上 C# 版本與 .NET Framework 版本並沒有絕對的關連性,像本次 C# 6.0 所提供的都是編譯器的特性,對 .NET Framework 的相依性沒有這麼大,因此無論你用 .NET Framework 4.5 或 .NET Framework 4.6 都可以使用 C# 6.0 進行編譯,只是在切換版本的過程中要小心,還是有些地雷會遇到,本篇文章整理了一些我曾經遇到的問題與解決方法,供大家參考。

Visual Studio 2013 + ASP.NET MVC 5

以下是在 Visual Studio 2013 開發工具中,將 ASP.NET MVC 5 改用 C# 6.0 進行編譯的步驟說明:

1. 建立 ASP.NET MVC 專案

2. 加入 C# 6.0 語法

image

3. 用 NuGet 安裝 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 套件,安裝過程的檔案變化我用 Git 版控列出在此

Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

image

從上圖你可以發現,由於 Visual Studio 2013 並不支援 C# 6.0 的語法,但編譯卻可以正常進行,所以其實不怎麼實用,如果你真的想用 C# 6.0 開發的話,建議還是改用 Visual Studio 2015 進行開發。

這裡比較需要注意的地方在於 C# 6.0 由於採用 Roslyn 進行編譯,因此在安裝 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 套件的過程中會修改你的 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>

不僅僅是所有 C# 檔案可以進行編譯,就連 ASP.NET MVC 的 View 頁面中的 Razor 語法也一樣可以用 C# 6.0 語法!

 

Visual Studio 2015 + ASP.NET MVC 5

從 Visual Studio 2015 建立的 ASP.NET MVC 5 專案,或選用 .NET Framework 4.5 以上框架版本的專案,預設就是用 C# 6.0 進行編譯,也就是這些專案範本建立的專案預設就會加入 <system.codedom> 區段設定,所以新建立的專案,預設就能用 C# 6.0 進行開發。

不過,這裡要提醒的就是,若你用 Visual Studio 2015 開啟 Visual Studio 2013 建立的專案,基本上是完全沒問題的,唯一的差別在於舊專案並不會有 <system.codedom> 區段設定,所以這些專案還是會以 C# 5.0 進行編譯,如果想改用 C# 6.0 編譯專案,你必須參照上面段落所寫的方法,用 NuGet 安裝 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 套件,這樣即可正常以 C# 6.0 編譯專案。

 

ASP.NET MVC 5 + .NET Framework 4.5 升級 .NET Framework 4.6 的問題

無論你用 Visual Studio 2013 或 Visual Studio 2015,如果你原本的專案參考使用 .NET Framework 4.5 框架,而你想要升級到 .NET Framework 4.6 框架版本的話,有些地方是需要注意的。

首先,我們先變更專案屬性的目標 Framework 版本到 .NET Framework 4.6

這個升級的過程,無論 Visual Studio 2013 或 Visual Studio 2015 都會幫你修改 Web.config 的 <system.codedom> 區段設定(而且會改壞),如果你先前已經安裝 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 套件也一樣,他會把你的 Web.config 改成用 Microsoft.CSharp.CSharpCodeProvider 進行編譯,但這是錯誤的,升級之後你去執行目前的 ASP.NET MVC 5 網站,就會看到以下錯誤(不過在 Visual Studio 中按下 F6 編譯時不會有錯誤提示):

由於 Web.config 的 <system.codedom> 區段設定被改壞,解決方法也很簡單,改回來即可。

也就是說,只要將這個區段改回以下內容,即可回復原本的編譯器平台:

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

簡單來說,就是把升級 .NET Framework 4.6  後的 Microsoft.CSharp.CSharpCodeProvider 換回 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider 來提供編譯服務。

 

相關連結