本文章是由機器翻譯。

基本技術

Visual Studio 2010 中的多版本開發 Visual Basic 應用程式

Spotty Bowles

之前 Visual Studio 2008,撰寫目標不同版本的 Microsoft.NET 架構的應用程式所需的 Visual Studio 開發環境的不同版本的安裝。每個安裝的 Visual Studio 提供不同的開發人員的經驗,並使用大量的磁碟空間。此外,專案檔格式變更每個版本的 Visual Studio 之間。如此一來您可以最後的專案或方案的多個版本時開發元件,以在以不同的.NET Framework 版本為目標的專案中使用。

Visual Studio 2008 已完全支援多重目標單一的 IDE,允許開發人員撰寫以不同版本的.NET Framework 2.0、 3.0 和 3.5) 為目標的應用程式中的第一個版本使用單一的 Visual Studio 安裝。結果呢?使用較少的磁碟空間需求的單一、 一致的開發人員經驗。

Visual Studio 2008 中多重目標工作,因為每個可用的架構使用相同的基礎 CLR 2.0。此外,建置在.NET Framework 2.0 的基礎,提供額外的功能,透過使用的架構的每個版本所參考的組件。最後,所有使用該.NET Framework 3.5 命令列 Visual Basic 編譯器 (vbc.exe)。

在本文中我討論 3.5] 和 [4] 編譯器指的編譯器安裝成個別的.NET Framework 3.5 和 4 的安裝的一部分。3.5 編譯器是 4 的編譯器版本隨附 Visual Studio 2010 和 Visual Basic 10 時,Visual Studio 2008 與 Visual Basic 9,出貨的版本。

因此 let’s 採取看如何為多重目標在 Visual Studio 中的運作方式今天,和接近您應該如何多針對您的專案中。

目標多重-設定在 Visual Studio 中

Visual 的 Studio 2008 中變更想要的目標架構是 的 圖 1 所示,在 [專案] 屬性的下拉式清單中選取目標一樣簡單。這會新增或移除特定的參考所需的每個架構版本和所做變更的架構輕鬆。


圖 1 變更 Visual Studio 2008 中您想要的目標 Framework

命令列編譯它是直接變更使用的參考組件的內容。

大的某些變更隨附 Visual Studio 2010,不過。新的.NET Framework 4 帶來 CLR 的新的版本。這表示在 Visual Studio 2008 中採用此方法並不實用,在 Visual Studio 2010。Visual Studio 2010 的結果為所有使用第 4 版的編譯器 multi-targeting、 甚至時以先前的.NET Framework 版本為目標。這可讓許多較新的語言功能,要用來進行向下為目標,並提供許多簡化開發經驗。

但是的下層的目標使用 Visual Studio 2010 功能的一個缺點是原始程式檔可能不是設計階段相容如果在使用較早版本的 Visual Studio。如果您共用專案建置使用不同版本的 Visual Studio 並以不同的.NET Framework 版本為目標的程式碼,可能有問題。

如果您要保留的所有設計階段工作在 Visual Studio 2010 專案,您有更好的經驗。您能夠產生目標往上使用 Visual Studio 2010 和.NET Framework 3.5 SP1 的.NET Framework 2.0 的組件。

設計階段的相容性

現在 let’s 看一下範例的設計階段相容性 gotcha。的 圖 2 中的程式碼使用隱含的行接續符號和自動實作屬性的功能,同時在 Visual Studio 2010 引入。這個程式碼可編譯時使用 Visual Studio 2010 編譯目標前進 2.0 從任何架構。讓產生的組件是執行階段相容。


圖 2 使用新的語言功能下層級目標中的精神工時

但是,採取此相同的原始程式檔,然後再試編譯使用任一編譯器的 3.5 或 2.0 版本 — 您產生 的 圖 3 所示的錯誤。


圖 3 原始程式碼從 Visual Studio 2010 不是設計階段相容,Visual Studio 2008

會發生這種情況是因為舊版編譯器知道有關這些功能的任何項目,並將此項視為無效的程式碼。因此來源檔案不是設計階段相容。若要讓這個設計階段相容,您必須使用只功能 3.5 編譯器中可用。

設計階段相容性有以及 Web 專案的影響。許多的 Web 專案的編譯發生伺服器上,,而伺服器的就當然會編譯使用在伺服器上安裝的目標架構編譯器的網頁]。因此如果您 Web 網頁,以 Visual Basic 目標 3.5 編譯器撰寫頁面會使用 3.5 版的 Visual Basic 編譯器 (vbc.exe) 的伺服器上進行編譯。3.5 編譯器知道其相關的任何項目時,任何使用 Visual Studio 2010 的新語言功能就會失敗。

在 Visual 使用第 4 版的編譯器的 Studio 2010 開發的程式碼中,您需要一個方法,來識別在編譯時期此需求,Web 網頁會部署至伺服器時,防止非預期的錯誤。與用於開發 Web 專案時產生 won’t 較早架構 ’s 編譯器編譯的較新語言語法功能有關的錯誤 /langversion 切換控制,您可以執行這項操作。在建置 ASP.NET 專案類型時此參數是在內部用來產生錯誤,如果您的程式碼使用新的 Visual Studio 2010 功能,但您的目標較早版本的架構。

雖然 /langversion 參數不任何其他的專案類型使用預設,很有用如果您想要確認您的來源程式碼是與先前版本的 Visual Studio 設計階段相容。

目標多重-設定在 Visual Studio 2010 IDE 中

多重目標使用者在 Visual Studio 2010 IDE 中的經驗是,Visual Studio 2008 幾乎相同。它仍然控制從專案] 屬性中,但在預設安裝您可能無法看見較早的目標架構。若要減少安裝大小,Visual Studio 小組決定不是用來在預設安裝的 Visual Studio 2010 交運 3.5 架構。這項變更表示您不會看到出現在目標架構下拉式清單] 或 [新增專案] 對話方塊中的這些架構] 選項。

若要將這些額外的架構,您需要安裝.NET Framework 3.5 SP1。您可以從 IDE 此權限。在 [新增專案] 對話方塊頂端請參閱選擇目標架構的下拉式功能表。如果只安裝.NET Framework 4,[] 功能表將包含下載更多的連結。如果安裝任何其他但是,看到只在.NET Framework 3.5 SP1 下拉功能表上因為 Visual Studio 只會辨識在.NET Framework 3.5 SP1 此處的安裝。

另一項變更,就必須執行與用戶端設定檔。這些在.NET Framework 3.5 SP1 引入,它們可讓應用程式使用的架構可以改善部署不需要像 ASP.NET 的架構的伺服器端部分包含輕量的版本。這些設定檔有 3.5 和 4 的架構目標。

結果已經變更為不同的專案類型的預設設定檔。用戶端專案類型 — Windows]、 [主控台]、 [Office] 和 [Windows Presentation Foundation (WPF) 的應用程式,將用戶端設定檔的預設值。但是,Web 應用程式的預設設定檔將會是 「 完整 」 因為不會部署 System.Web 例如用戶端的設定檔與程式庫的參考。

類別程式庫也會預設為完整的設定檔,但可以輕鬆地變更回至用戶端設定檔如果您只根據部署的用戶端設定檔的參考。如果類別庫設定為完整的設定檔,然後使用用戶端設定檔與專案中,它仍會運作,只要將程式庫 doesn’t 取決於不是用戶端架構組件的一部分的參考。

預設情況下,無加入至類別庫專案類型的參考需要完整的設定檔。但是,因為它們部署與應用程式,應用程式部署設定檔就會是重要的設定,以確保完整的應用程式功能。如果您的媒體櫃,取決於用戶端範圍之外的參考,文件庫,並使用它的應用程式需要採用完整的設定檔。

目標多重-設定使用命令列編譯器

第 4 版的編譯器有無其中,不幸的是,控制目標架構,因此 ’s 一定要了解一些有關每個參數,以及它們如何運作命令列的參數的數目。

如果已安裝.NET Framework 4,則很可能建置使用 vbc.exe 應用程式,而不需在組建電腦上所安裝的 Visual Studio 目標較早版本的架構。直接呼叫命令列編譯器的建置指令碼通常用在較大的開發環境中。如果您目標較早的版本,從命令列,這會需要與舊的架構版本為目標您,安裝,因此最好的計劃,就是讓.NET Framework 3.5 SP1 和.NET Framework 4 在電腦上安裝的檔案。

這牢記一些潛在的參數為多重目標的詳細資訊在 的 圖 4

圖 4 命令列建置切換至目標控制項多重-設定

參數 描述
langversion 提供錯誤來源的程式碼使用 don’t 符合特定語言版本的功能。(9.0 與相關目標到.NET Framework 3.5; 10 與.NET Framework 4 目標)。這不實際判斷目標架構或CLR 所使用,但它可以讓以識別下目標案例中使用的 Visual Studio 2010 功能的 Web 專案。
vbruntime 雖然有 ’s 不同版本的.NET Framework 4 的 Microsoft.VisualBasic,只嘗試指定 2.0 版的 Microsoft.VisualBasic.dll doesn’t 運作和 4 NetFX 會導致 ’s 依存於該版本的組件。
nostdlib 防止標準參考到 system.dll 加到組件。雖然可以使用這個選項,連同 system.dll 版本的參考 2.0 架構中,結果仍是第 4 版的組件。
sdkpath 索引鍵的選項,指定 MSCorLib.dll 和 Microsoft.VisualBasic.dll,如果 vbruntime 參數不會指定將使用哪一個,請使用哪一種版本。但是,這不是明確的參考您通常會看到在參考清單中。而是,編譯器包含這在標準的參考。當您想要的 2.0 版,將它加入就多為目標的方案的一部份 MSCorLib,不版本 4。
noconfig 讓編譯器以避免新增預設的參考、 匯入和否則就要使用的 [vbc.rsp] 檔案中所包含的參數。

下表提供快速的描述的每一個的切換參數,但若要實際建立下為目標的編譯,需要使用組合 — 有 ’s 沒有單一的 multi-target 切換。一個版本 3.5] 目標的最重要的參數是 mscorlib 的可以讓您指定 2.0 版的 sdkpath。然後,請確定您的參考都指向 System.dll、 System.core.dll 和任何其他先前的目標架構組件的正確版本。(這些位於 %programfiles%\Reference Assemblies\Microsoft\Framework\v3.5 資料夾)。

您必須指定要避免使用預設的參數,在 「 第 4 版包含編譯的預設設定的 vbc.rsp noconfig 參數。不新增這個關鍵參數,編譯器會等等新增這些預設值 4 參考,匯入。

多重目標命令列編譯最佳展示的範例。在此我只需編譯簡單的來源檔案到目標.NET Framework 3.5 的 test.vb:

vbc.exe /noconfig /sdkpath:D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 /r:"D:\Program Files\ReferenceAssemblies\Microsoft\Framework\v3.5\System.Core.dll" d:\school\test.vb  /out:\school\test.exe

當您了解要編譯 3.5 組件參數時,2.0 的目標而是只涉及移除某些參考,例如 system.core.dll,所需的 3.5 架構。sdkpath 和 noconfig 參數保持不變:

vbc.exe /noconfig /sdkpath:D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 d:\school\test.vb /out:\school\test.exe

一旦編譯過的二進位檔,您可以採用如 MSIL 解譯器 (Ildasm.exe) 或.NET 反映程式,查看所使用的參考的版本的工具。這可讓您決定是否在想要的目標架構上執行可執行檔。

用戶端設定檔] 和 [混合] 目標方案

稍早在發行項中提用戶端設定檔的大部分的專案類型的預設值。當部署這類應用程式時,較小足跡架構安裝,就會發生。此部署的一部分中,您可以觀察部署命令列編譯器。這是相同版本的編譯器部署與完整的架構,但嘗試編譯用戶端設定檔上的簡單應用程式時,有 ’s 潛在 gotcha。

在用戶端架構的電腦上使用此命令會失敗,因為用戶端架構不會隨附包含預設值參考的 vbc.rsp:

vbc.exe test.vb /out:test.exe

必須指定所有參考,並會通常包含在 vbc.rsp 的匯入陳述式檔案,或您自己建立。

單純編譯用戶端架構安裝的 Visual Basic 應用程式所需的最小值參數為:

/r:System.dll/imports:System/imports:Microsoft.VisualBasic

藉由包含這些參數,您可以編譯基本的 Visual Basic 應用程式。但是,您應該編譯應用程式的電腦上 
that 已安裝完整的架構。

混合目標解決方案 — 類別程式庫,以配合目標.NET 架構 4 的用戶端應用程式的.NET Framework 3.5 建置 — 都支援但一些警告。在 Visual Studio 2010 IDE 中如果使用專案參考,以及它們所提供的經驗的習慣您可以仍收到此經驗如果目標架構,在專案參考中的使用相同版本的 MSCorlib。圖 5 顯示 MSCorlib 版本和支援的架構版本。

圖 5 MSCorlib 和架構版本相容性

MSCorlib 版本 支援的架構 設定檔
2.0 2.0, 3.0, 3.5 用戶端和完整的設定檔
4.0 4 用戶端和完整的設定檔

因此如果您使用.NET Framework 3.5 應用程式上針對 MSCorlib 2.0 的類別程式庫,您都仍可以使用專案參考。同樣地,.NET Framework 4 的用戶端設定檔 Windows 應用程式所參考的.NET Framework 4 完整設定檔類別程式庫可以有文件庫的專案參考。

但是,如果您使用專案對專案參考,使用不同版本的 MSCorlib,專案參考將會轉換成檔案參考。這表示需要手動重建方案,當您更正錯誤。經驗會熟悉如果您與已在 C# 和 Visual Basic 中撰寫的多個參考的專案的解決方案一起工作。您會遺失一些方便的功能可以使用例如重新命名跨專案] 和 [自動背景編譯的專案參考。

IDE 可您稍微從怎樣在幕後編譯,期間,但不是每個人都從 IDE 建置。如果目標架構,以使用 MSCorlib 的常見的版本與架構的變更,將自動檔案參考變更回到專案參考,因此它不 ’s 真實檔案參考。

如果您使用第 4 版的應用程式中的向下目標 (3.5) 的類別程式庫,會發生什麼事?類別程式庫會實際執行對.NET Framework 4 中。發生大量測試以確保這種情況下適用於在執行階段有幾個問題。不過,嘗試在 3.5 架構應用程式中使用 4.0 架構類別程式庫不支援,而且當建置與 Visual Studio 或 MSBuild 就會產生編譯時期錯誤。若要使用 [4.0 3.5 架構目標應用程式中的架構類別程式庫但是,您必須向目標類別程式庫,以.NET Framework 3.5。

請記住,不過,能夠使用 Visual Studio 2010 語言功能上向下目標案例,目標類別程式庫,以.NET Framework 3.5 應該不是一大問題。圖 6 摘要了新的功能,您可以預期在向下目標專案中運作。

圖 6 的 新下目標案例中的 Visual Studio 功能

語言功能 向下目標案例中運作
集合初始設定式 [是]
陣列初始設定式 [是]
自動實作屬性 [是]
隱含的行接續符號 [是]
陳述式 lambdas [是]
沒有 PIA
動態 Interop
Co/contravariance 部分

pIAs 和 Interop

使用.NET Framework 程式針對 Microsoft Office 物件模型需要組主要 Interop 件 (PIA),必須部署至使用者 ’s 機器使用。這些組件通常都非常大,並部署它們可以是一個討厭。

新的型別內嵌功能可讓您無須 PIA 使用者 ’s 電腦上部署這些應用程式。它會產生直接執行,Interop 呼叫 COM 程式庫的內嵌 Interop 類型。這些類型會加註的一種 CLR 會將所有內嵌 Interop 的型別執行個體視為等同於編譯器。編譯器將不會複製每個型別中 [PIA 您組件只是您實際使用的。如需詳細的資訊請參閱 「 型別同義和內嵌 Interop 類型 」 在 MSDN 程式庫 ( msdn.microsoft.com/library/dd997297(VS.100) )。

.NET Framework 4 下方的下目標案例並不支援這項功能的功能。使用 [Visual Studio IDE 這就不會立即明顯因為設定參考所使用的一般參考中的向下目標案例結果中內嵌 Interop 屬性為 True。從 IDE 功能使用者的經驗是組件會繼續建置,但會回復為需要部署的 PIA 的標準參考的行為。

從 [命令] 列參考是通常新增使用 /reference 參數。內嵌,/link 選項用來代替。嘗試使用 /link 選項下目標案例會導致編譯錯誤。

這裡 ’s 內嵌 Word Interop 組件中的型別是命令列的範例:

D:\Windows\Microsoft.NET\Framework\v4.0.30128\Vbc.exe /imports:Microsoft.VisualBasic,System /link:"D:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Word.dll" /reference:"D:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Core.dll","D:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.dll" /out:ConsoleApplication16.exe /target:exe Module1.vb

這個行為是很重要的因為依預設值,COM 參考加入至專案,以在 Visual Studio 2010 將內嵌的 Interop 屬性設定為 true。因此變更目標架構時,應該不會導致額外的錯誤,但可能的話,應該提供內嵌的 Interop 型別的好處。

Visual Studio 2010 不支援向下目標案例中的另一個新功能是動態的 Interop,因為之前,Visual 的 Studio 2010 didn’t 存在的動態語言執行階段 (DLR)。

其他問題

共變數 contravariance 支援用於使用者定義的介面。但是,下層的目標的基底類別庫 (BCL) 介面並不會變更,因此使用具有這些基底類別的功能不受支援。共變數和 contravariance 的詳細資訊,請參閱在 3 月 2010年問題, MSDN Magazine ( msdn.microsoft.com/magazine/ee336029 ) 的基本技術資料行。

如果有專案或方案在舊版的 Visual Studio 2010 在開啟的 Visual Studio 中建立請參閱標準 [升級] 對話方塊。Visual Studio 會使用 Visual Studio 2010 專案或方案的檔案進行必要的變更。但是,有兩個不同的動作參與升級您可能影響多重目標鎖定的檔案。

如果您安裝的.NET Framework 3.5 SP1 升級的對話方塊會允許升級到 Visual 的 Studio 2010 專案或方案的檔案,但指定專案的目標架構將維持不變。因此如果您升級.NET Framework 3.5 為目標的應用程式,升級後它應該仍然目標 3.5 的架構。

如果您沒有安裝的.NET Framework 3.5 SP1 您 can’t multi-targets 正確建置因為需要 MSCorlib 和參考組件的 2.0 版。對話方塊會提供選項,第 4 版架構變更目標,或無法升級該專案。最佳的課程在這種情況下會是取消升級,請安裝.NET Framework 3.5 SP1 中,然後透過一次升級該專案的程序執行。

藉由更瞭解的 Visual Basic,在 Visual Studio 2010 多重目標的 [實作] 細節的您應該可以撰寫程式碼,會產生可以部署上使用 IDE 或命令列,架構的先前版本,但還是利用一些新的 Visual Studio 2010 功能的組件。雖然多目標有一些警告,會保留開發和部署 can’t 立即升級為使用.NET Framework 4 的應用程式的能力。

Adrian Spotty Bowles* 具有開發使用 Visual Basic 的每個版本,並設法找出他台北市,方式 Wash.] 中他運作方式用 Visual Basic 產品小組為軟體設計工程師軟體測試人員著重在 Visual Basic 編譯器。他是有關 Visual Basic 還是熱愛和通常位於接聽問題 MSDN Visual Basic 論壇。您可以在的 Abowles@microsoft.com 到達 Bowles*

多虧來檢閱本文的下列的技術專家:Kevin Halverson 和 Beth Massi