﻿# 分享幾個 Visual Studio 2010 專案升級後無法編譯的問題

若使用 Visual Studio 2010 升級現有 ASP.NET 2.0 / 3.5 的專案到 ASP.NET 4.0 在大部分的情況下應該都沒問題才是，就算你在開啟就專案時選擇「不升級」照理說也應該沒問題，但前陣子在測試的過程中還是遇到了幾個不管升級到 ASP.NET 4 還是保留在原本的 ASP.NET 3.5 都有遇到網站進行編譯的情況，以下是一些經驗分享。

我遇到的問題共兩種，我也分別用兩個開放原始碼的專案來解說：

**第一種：找不到組件 / [**Samples Environment for Microsoft Chart Controls**](https://web.archive.org/web/20081023100227/http://code.msdn.microsoft.com/mschart)**

這個專案是之前在 ASP.NET 3.5 的時候微軟針對 **Microsoft Chart Controls for .NET Framework** 所提供的範例程式，由於**圖表控制項**以在 ASP.NET 4 內建進去，所以如果你的電腦之前有安裝過 [Microsoft Chart Controls for Microsoft .NET Framework 3.5](http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displaylang=zh-tw) 的話，那麼你編譯並不會出問題。但如果沒安裝過的話，就會發生編譯失敗的問題，如下圖示：

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

這時你有兩種解法：

1\. 安裝 [Microsoft Chart Controls for Microsoft .NET Framework 3.5](http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displaylang=zh-tw) 即可

2\. 修改 Web.config 將所有與 **圖表控制項** 相關的組件設定修改成 4.0 版即可 ( 如下圖把 3.5 改成 4.0 )

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

如下圖示，共有三個地方要修改：

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

**第二種：組件版本衝突 /** [**KiGG**](https://github.com/writeameer/Kigg) for ASP.Net MVC 2 RTM on .Net 3.5 SP1 ( Change set 38916 )

KiGG 專案非常複雜且龐大，可喜可賀的是大部分的專案都能夠順利升級成功！但是當我選擇「不升級」的時候，方案中的 Web 專案在建置的時候就會出現組件版本衝突的問題，如下圖示 (點圖可放大)：

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/273d00ec5e9626763350-image_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b46a93182f19cdc2dd9f-image.png)

由於 [**KiGG**](https://github.com/writeameer/Kigg) 是 ASP.NET MVC 專案，所以會用到 ASP.NET 3.5 SP1 的 **System.Web.Routing.dll** 組件，不過 System.Web.Routing 已經被整合進 ASP.NET 4 ( System.Web.dll 組件 )，而在編譯的時候同時載入了 .NET 3.5 的組件與 .NET 4.0 的組件才會導致這種狀況，但問題就在**為什麼一個 ASP.NET 3.5 的專案在編譯的時候會參考到 .NET 4.0 的組件呢？**

這個問題發生在 MvcBuildViews 設定為 true 的情況下編譯 View (檢視)，才會出現此問題。而問題的主因就在於 Visual Studio 2010 編譯 ASP.NET 網站是透過 [aspnet\_compiler.exe](http://msdn.microsoft.com/en-us/library/ms229863.aspx) 工具編譯網站的，這工具在 ASP.NET 2.0 就有了，只是 ASP.NET 4.0 又有一份新的版本，由於 Visual Studio 2010 不知為何選取了 ASP.NET 4.0 的 [aspnet\_compiler.exe](http://msdn.microsoft.com/en-us/library/ms229863.aspx) 來編譯 ASP.NET 3.5 的網站，這才導致這個問題發生。

我們先來看看在 **v2.x\\Web\\Kigg.Web.csproj** 這個專案的內容中，有個 MSBuild 的 AfterBuild 事件，其中有個 [AspNetCompiler 工作](http://msdn.microsoft.com/en-us/library/ms164291.aspx)，就是這裡發生問題 ([我覺得是 Bug，已回報微軟](https://connect.microsoft.com/VisualStudio/feedback/details/557798/visual-studio-2010-compile-asp-net-3-5-website-using-net4s-aspnet-compiler-exe))：

```xml
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" 
                  PhysicalPath="$(ProjectDir)\..\Web"/>
</Target>
```

解決的方法也很簡單，多加上一個 [ToolPath 屬性](http://msdn.microsoft.com/en-us/library/microsoft.build.utilities.tooltask.toolpath.aspx)指定 aspnet\_compiler.exe 工具的所在路徑即可，新的設定如下：

```xml
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp"  PhysicalPath="$(ProjectDir)\..\Web"
    ToolPath="C:\Windows\Microsoft.NET\Framework\v2.0.50727" />
</Target>
```

加上去之後就可以正常編譯了。

這還真不是普通的冷門技術，連文件都沒寫，如果不到國外論壇發問真的很難找到解決方案。

**相關連結**

-   [ASP.NET Compilation Overview](http://msdn.microsoft.com/en-us/library/ms178466.aspx)
-   [ASP.NET Compilation Tool (Aspnet\_compiler.exe)](http://msdn.microsoft.com/en-us/library/ms229863.aspx)
-   [AspNetCompiler Task ( .NET 4 )](http://msdn.microsoft.com/en-us/library/ms164291.aspx)
-   [ASP.NET MVC 開發心得分享 (11)：對 Views 進行編譯檢查](/post/2009/09/04/ASPNET-MVC-Developer-Note-Part-11-Compile-Views-in-ASPNET-MVC)
-   [Unable to build ASP.NET 2.0 web application under Visual Studio 2010](http://forums.asp.net/t/1551418.aspx)
