The Will Will Web

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

分享幾個 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

這個專案是之前在 ASP.NET 3.5 的時候微軟針對 Microsoft Chart Controls for .NET Framework 所提供的範例程式,由於圖表控制項以在 ASP.NET 4 內建進去,所以如果你的電腦之前有安裝過 Microsoft Chart Controls for Microsoft .NET Framework 3.5 的話,那麼你編譯並不會出問題。但如果沒安裝過的話,就會發生編譯失敗的問題,如下圖示:

這時你有兩種解法:

1. 安裝 Microsoft Chart Controls for Microsoft .NET Framework 3.5 即可

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

 

如下圖示,共有三個地方要修改:

 

第二種:組件版本衝突 / KiGG for ASP.Net MVC 2 RTM on .Net 3.5 SP1 ( Change set 38916 )

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

由於 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 工具編譯網站的,這工具在 ASP.NET 2.0 就有了,只是 ASP.NET 4.0 又有一份新的版本,由於 Visual Studio 2010 不知為何選取了 ASP.NET 4.0 的 aspnet_compiler.exe 來編譯 ASP.NET 3.5 的網站,這才導致這個問題發生。

我們先來看看在 v2.x\Web\Kigg.Web.csproj 這個專案的內容中,有個 MSBuild 的 AfterBuild 事件,其中有個 AspNetCompiler 工作,就是這裡發生問題 (我覺得是 Bug,已回報微軟):

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

解決的方法也很簡單,多加上一個 ToolPath 屬性指定 aspnet_compiler.exe 工具的所在路徑即可,新的設定如下:

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

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

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

相關連結