最近接連遇到兩次的問題。
首先是某個用 Visual Studio 2017 開發的專案,同事 T 從 TFS 取回最新版以 VS2017 開啟,其中卻有兩個 MVC 專案呈現截入失敗,其他還有 Class Library 及 Web Site Project 等多個專案則沒問題;改用 VS2015 開啟則能正常載入。
嘗試重新載入專案會出現以下錯誤訊息,並附上一段說明連結:
SomeMVC\SomeMVC.csproj: 找不到這種專案類型的基礎應用程式。請嘗試這個連結以取得其他資訊: (其英文為 The application which this project type is based on was not found. )
http://go.microsoft.com/fwlink/?LinkID=299083&projecttype=E3E379DF-F4C6-4180-9B81-6769533ABE47
但說明連結已失效最終被導向 http://www.asp.net,斷了線索。
同事 T 有使用 VS2017 在開發其他 MVC 專案,當場實測開啟其他 MVC 專案正常,排除 VS2017 未安裝 MVC 專案型別支援的可能。
無獨有偶,同事 J 也回報他重新安裝 VS2017 後,也出現前幾天還在維護的 MVC 專案卻載入失敗況,請我試試有無問題。一樣是我的 VS2017 可開啟,同事的 VS2017 無法載入。
歸納兩起案例:
- 訊息指向 VS2017 不支援 MVC 專案型別,但當下開啟其他 MVC 專案又正常。
- 我的 VS2017 開啟問題 MVC 專案並無問題。
- 同事改用 VS2015 開啟問題 MVC 專案則正常。
- 無法載入的 MVC 專案共通點是多年前建立 (甚至可回溯至 VS2012/VS2013 時代),猛然發現,問題專案都是 ASP.NET MVC4!
- 同事 J 的案例更有趣,重新安裝 VS2017 後,前幾天還在維護的 MVC 專案忽然無法載入。
爬文在 VS 討論版找到解法:
使用文字編譯器開啟問題 .csproj,其中有個 ProjectTypeGuids,長得類似 <ProjectTypeGuids>{E3E379DF-F4C6-4180-9B81-6769533ABE47};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
將第一個 {E3E379DF-F4C6-4180-9B81-6769533ABE47}; 刪掉,經實測可立即排除問題。
不過,網路查到的狀況發生於 VS2017RC 版,依據 VS Team 在 2017/3/2 的留言,問題已於正式 Release 時修正。我的 Visual Studio 2017 是 RTM 時安裝一路升級,開啟 MVC4 專案沒問題。同事 T 安裝時間較晚,同事 J 則是移除重裝最新版時出狀況。莫非是新版 VS2017 移除了過時的 MVC4 專案支援?
研究問題的過程中,學到兩則冷知識:
- ASP.NET MVC 專案是所謂的 Flavored Project (或稱為 Project Subtype,專案子型別)
Eilon Lipton's Blog - Opening an ASP.NET MVC project without having ASP.NET MVC installed- The p
意思是 ASP.NET MVC 並未另建新專案型別,而是在 ASP.NET Web Application Project 專案型別上加料讓專案具有 MVC 特性。 - .csproj 中有個 ProjectTypeGuids 可包含多個 GUID 值代表專案子型別
List of Visual Studio Project Type GUIDs - CodeProject整理了專案子型別 GUID 清單,查表得知問題 MVC4 專案共有
* ASP.NET MVC 4 {E3E379DF-F4C6-4180-9B81-6769533ABE47}
* ASP.NET MVC 5 {349C5851-65DF-11DA-9384-00065B846F21}
* C# {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
三種專案子型別。
結論,新安裝 VS2017 開啟 MVC4 專案如遇無法載入狀況,手動編譯 .csproj,移除 ProjectTypeGuids 中的 {E3E379DF-F4C6-4180-9B81-6769533ABE47} 可排除問題。
但成功載入後,可能還有缺少參照組件問題,例如 System.Net.Http.Formatting 來自 GAC,若機器沒裝過 ASP.NET MVC4 套件,就不會有 C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4 資料夾跟相關組件。
要解決此問題,可移除缺少的參照組件改由 NuGet 下載安裝,或是一不做二不休將專案升級成 MVC5,升級方式可參考官方文件:如何升級 ASP.NET MVC 4 和 Web API 專案,以 ASP.NET MVC 5 和 Web API 2 - Microsoft Docs。