摘要:VS 2010 和 .NET 4.0 系列之《多目標版本支援》篇
【原文位址】Multi-Targeting Support (VS 2010 and .NET 4 Series
【原文發表日期】Thursday, August 27, 2009 11:48 PM
這是我針對即將發佈的VS 2010 和 .NET 4所撰寫的 文章系列的第三篇。
今天的文章討論VS 2010中增強了的多目標版本(multi-targeting)支援,該支援允許你使用和目標.NET的多個版本。我們在VS 2010版本中做了重大的架構層次工作,實現了若干個新的多目標特性,提供了更佳的體驗。
理解並列(Side-by-Side)的含義
VS 2010可以和Visual Studio的早期版本並列(side by side)安裝。這意味著,你可以在安裝了VS 2008/VS 2005/VS 2003的同個機器上安裝VS 2010,如果你想要的話,可以同時使用所有這些版本。
.NET 4.0也可以和.NET的早期版本並列(side by side)安裝在同個機器上。.NET 4.0給了框架類別庫和CLR引擎新的版本號碼,這意味著,它可以完全獨立於.NET 2.0, 3.0 和 3.5運行。這意味著,你可以在安裝了.NET 2.0/3.0/3.5的機器上安裝 .NET 4.0, 配置某些應用使用.NET 4.0來運行,其他應用使用老一點的.NET版本來運行(IIS管理器工具允許你配置一個ASP.NET應用所使用的.NET版本)。這允許你將.NET 4.0用於新的應用,而沒有必要測試和升級所有現有的應用。
VS 2008的多目標版本支援
VS 2008是第一個包含.NET多目標版本支援的Visual Studio版本,這意味著,你不光可以使用VS 2008建立和編輯.NET 3.5 專案,也可以建立和編輯.NET 3.0 和 .NET 2.0專案。這允許開發人員更快地升級和充分利用新的Visual Studio工具特性,而不必要求在運行他們應用的客戶機和生產性伺服端安裝新一點的.NET 版本。
VS 2008的多目標版本支援利用了.NET 2.0, .NET 3.0, 和 .NET 3.5都是在同個版本的CLR之上運行的這個事實,而這三個.NET 版本的主要區別在於它們的框架類別庫。結果是,Visual Studio的編譯器能夠生成同樣的IL輸出,偵錯器能夠針對同個CLR引擎進行偵錯,IDE對多目標的支援主要著重於過濾掉不支援某個給定.NET 版本的新的程式集和專案模板的的顯示。
這個多目標體驗是可行的,儘管不完美。VS 2008中的Intellisense總是顯示.NET 3.5版本的框架類別庫的型別和成員(即使你目標的是.NET 2.0)。這意味著,你有時候會在無意中使用一個ASP.NET 3.5才有的方法,儘管你是在開發一個ASP.NET 2.0 專案。
VS 2010的多目標版本支援
我們在VS 2010中做了一些非常重大的架構級改動,來促成更好和更精確的多目標版本支援。
VS 2010現在給每一個.NET版本都配置了我們稱之為「引用程式集(reference assemblies)」的東西。「引用程式集」只包含某個特定框架程式集的元資料,而不是它的實現(因此所佔硬碟極小)。但這個元資料足夠確保VS 2010總是能夠在目標某個.NET 框架版本時提供百分之百精確的intellisense。這還意味著,透過設計器中屬性表格呈示的屬性,對像瀏覽器中的API列表,以及IDE中所有其它各種地方都能精確地顯示出確切版本的API簽名。
我們還更新了VS 2010偵錯器,profiler和編譯器,使之能夠目標多個CLR版本。
使用VS 2010的多目標版本支援
為更好地理解這些新的多目標特性的工作原理,讓我們用VS 2010來建立一個新的ASP.NET Web應用。我們先用 「文件->新專案」選單命令調出「新專案」對話框,使用對話框頂部的版本下拉框過濾專案模板,使之只顯示.NET 2.0所支援的模板,然後建立一個新的ASP.NET 2.0 web應用專案:
因為這個專案目標的是.NET 2.0,VS 2010 會自動對工具箱和標識intellisense進行過濾,只允許我們使用那些隨ASP.NET 2.0發佈的控制項。不像VS 2008,VS 2010中的屬性表格現在自動過濾,只顯示那些ASP.NET 2.0按鈕控制項所支援的屬性:
在編寫程式碼時,VS 2010現在也只顯示.NET 2.0所支援的那些型別和方法/屬性/事件的程式碼intellisense。在下面,在鍵入「Response.Re」時,你可以看到ASP.NET 2.0 「Response」物件的intellisense:
在使用內建的VS web伺服器運行應用時,它會使用 ASP.NET 2.0版本來運行(VS 2010偵錯器偵錯的是CLR 2.0行程):
將專案從.NET 2.0 移植到.NET 4.0
或者,我們也可以在解決方案管理器中右擊專案,調出它的屬性對話框,來將專案重新目標,使之在.NET後期版本下工作。我們可以選擇對話框上的「目標框架(target framework)」下拉框,選擇我們想要目標的.NET框架版本:
我們可以從上面的各種不同的.NET版本中任選一個。該列表中包括了一個"Server Core"(伺服器核心)profile,支援無介面的Windows Server 2008 R2版本,它不支援某些APIs。因為我們用於元資料和intellisense的引用程式集能夠支援任意一個版本,如果它們引進任何新的API的話,我們甚至能夠在將來的服務包中發佈它們的版本,以促成百分之百的精確性。
在這個示範中,我們將選擇把專案移植到.NET 4.0,完畢後,VS 2010將自動地更新專案的引用程式集,以及專案的web.config文件來適當反映出所用的新版本。
做完這一步後,VS 2010 會過濾工具箱和標識intellisense,顯示ASP.NET 4.0版本中所有新的控制項和屬性。 例如,下面的屬性表格現在顯示了新的「ClientIDMode」屬性,該屬性是ASP.NET 4.0中所有控制項都有的,它能讓你控制客戶端ID是如何輸出的,以避免醜陋的客戶端id(這是ASP.NET 4.0中的一個新特性,我會在以後的部落格中討論):
至此,我們將專案升級到使用.NET 4.0,VS 2010現在也會顯示.NET 4.0中的新的型別和型別中的方法/屬性/事件的程式碼intellisense。例如,在下面,你可以看到 ASP.NET 4.0 「Response」 物件上的一些新的redirect方法(是在前面專案目標.NET 2.0時沒有出現的):
上面新的Response.RedirectPermanent()方法方便了發出「HTTP 301 Moved」回復,該回復可以避免你的網站在搜索引擎中積存失效的連結。URL導向引擎現在也同時為基於ASP.NET Web Forms 和 ASP.NET MVC的應用所支援,新的Response.RedirectToRoute()方法允許你輕鬆地重新目標到在其中宣告的路徑。
最後,在我們使用內建的VS web伺服器運行應用時,VS 2010現在會使用ASP.NET 4.0版本來運行這個應用:
結語
VS 2010的多目標版本支援允許你開發目標 .NET 4.0, .NET 3.5, .NET 3.0 和 .NET 2.0的專案。它允許你開始利用新的工具特性,而不必馬上將運行你應用的客戶機和伺服器升級到.NET 4.0。這改進了的多目標版本支援將確保其體驗比以前更好,更精確。
希望本文對你有所幫助,
Scott
附註: 除了寫部落格外,最近我一直在使用Twitter發短文和共享連結。你可以在Twitter上透過 http://www.twitter.com/scottgu (@scottgu是我的twitter名)跟隨我。