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

由於 C# 6.0 採用全新 [Roslyn](https://github.com/dotnet/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](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c67c2fae41524df23022-image_2713.png "image")

3\. 用 NuGet 安裝 [Microsoft.CodeDom.Providers.DotNetCompilerPlatform](https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform) 套件，安裝過程的檔案變化我用 Git 版控列出[**在此**](https://github.com/doggy8088/VS2013MVC5UsingCS6/commit/6cb0020179ebd676abf7ff94c34ad9afe01c6428)。

```
Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
```

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ec8e31083371e2c5e889-image_2714.png "image")

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

這裡比較需要注意的地方在於 C# 6.0 由於採用 Roslyn 進行編譯，因此在安裝 [Microsoft.CodeDom.Providers.DotNetCompilerPlatform](https://www.nuget.org/packages/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](https://www.nuget.org/packages/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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d1829cd27c1fa151bcca-image_2715.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f110ab9a44cca352f649-image_2716.png)

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/628768b062549b6b1364-image_2717.png)

由於 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** 來提供編譯服務。

**相關連結**

-   本文章範例專案：[https://github.com/doggy8088/VS2013MVC5UsingCS6](https://github.com/doggy8088/VS2013MVC5UsingCS6 "https://github.com/doggy8088/VS2013MVC5UsingCS6")
-   所有操作過程的版本紀錄：[https://github.com/doggy8088/VS2013MVC5UsingCS6/commits/master](https://github.com/doggy8088/VS2013MVC5UsingCS6/commits/master "https://github.com/doggy8088/VS2013MVC5UsingCS6/commits/master")
-   [初探 Roslyn 編譯器平台 (1): 從認識到使用 - MSDN 台灣部落格](https://learn.microsoft.com/en-us/archive/blogs/msdntaiwan/roslyn-1)
-   [The .NET Compiler Platform ("Roslyn") – GitHub](https://github.com/dotnet/roslyn)
-   [.NET Compiler Platform ("Roslyn") Overview](https://github.com/dotnet/roslyn/wiki/Roslyn%20Overview)
-   [.NET Compiler Platform - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/.NET_Compiler_Platform)
