共用方式為


設計專案子類型

專案子類型可讓 VSPackage 根據 Microsoft Build Engine (MSBuild) 擴充專案。 使用匯總可讓您重複使用在 Visual Studio 中實作的大部分核心受控項目系統,但仍自定義特定案例的行為。

下列主題詳細說明項目子類型的基本設計和實作:

  • 專案子類型設計。

  • 多層級匯總。

  • 支援介面。

專案子類型設計

項目子類型的初始化是藉由匯總主要 IVsHierarchyIVsProject 對象來達成。 此匯總可讓項目子類型覆寫或增強基底專案的大部分功能。 專案子類型第一次有機會使用 IVsHierarchy、使用 IOleCommandTarget 和的命令來處理 IVsUIHierarchy屬性,以及使用 IVsProject3的項目專案管理。 專案子類型也可以擴充:

  • 項目組態物件。

  • 設定相依的物件。

  • 與設定無關的瀏覽物件。

  • 專案自動化物件。

  • 專案自動化屬性集合。

如需依專案子類型擴充性的詳細資訊,請參閱 依專案子類型擴充的屬性和方法。

原則檔案

Visual Studio 環境提供擴充基底項目系統及其原則檔實作中專案子類型的範例。 原則檔案允許透過管理功能來塑造 Visual Studio 環境,包括 方案總管、新增專案對話方塊、新增專案對話框和 [屬性] 對話方塊。 原則子類型會透過 IVsFilterAddProjectItemDlgIOleCommandTarget IVsUIHierarchy 實作覆寫並增強這些功能。

匯總機制

環境的專案子類型匯總機制支援多個匯總層級,因此可藉由進一步將類別化專案實作進一步的子類型。 此外,專案子類型的支援物件,例如 IVsProjectFlavorCfg,是設計成允許多個層級的分層。 為了符合 COM 和 COM 匯總規則的條件約束,必須合作設計專案子類型和基底專案,才能讓內部子類型或基底專案適當參與委派方法呼叫和管理參考計數。 也就是說,即將匯總的專案必須進行程序設計以支持匯總。

下圖顯示多層級專案子類型匯總的圖解表示法。

Visual Studio multilevel projectflavor graphic

多層級專案子類型匯總包含三個層級,一個基底專案,由專案子類型匯總,然後由進階專案子類型進一步匯總。 此圖著重於 Visual Studio 專案子類型架構中提供的一些支援介面。

部署機制

專案子類型所增強的許多基底項目系統功能包括部署機制。 項目子類型會藉由實作在 上IVsProjectCfgProvider呼叫 QueryInterface 所擷取的組態介面,例如 IVsDeployableProjectCfgIVsBuildableProjectCfg來影響部署機制。 在項目子類型和進階項目子類型新增不同組態實作的案例中,基底專案會呼叫 QueryInterface 進階專案子類型的 IUnknown。 如果內部專案子類型包含基底專案所要求的組態實作,則進階專案子類型會委派給內部專案子類型所提供的實作。 作為將狀態從某個匯總層級保存到另一個匯總層級的機制,所有專案子類型層級都會實 IPersistXMLFragment 作,以將非建置相關的 XML 數據保存在專案檔中。 如需詳細資訊,請參閱 在 MSBuild 專案檔中保存數據。 IInternalExtenderProvider 實作為從專案子類型擷取自動化擴充器的機制。

下圖著重於自動化擴充器實作,特別是專案組態瀏覽物件,由專案子類型用來擴充基底項目系統。

VS Project Flavor Auto Extender graphic

專案子類型可以藉由擴充自動化物件模型,進一步擴充基底項目系統。 這些定義為 DTE 自動化物件的一部分,並用來擴充 Project 對象、 ProjectItem 物件和 Configuration 物件。 如需詳細資訊, 請參閱擴充基底項目的物件模型。

多層級匯總

包裝較低層級專案子類型的專案子類型實作必須合作進行程序設計,才能讓內部專案子類型正常運作。 程式設計責任清單包括:

  • 包裝IPersistXMLFragment內部子類型的專案子類型實作必須委派給 IPersistXMLFragmentSave 方法之內部專案子類型的Load實作。

  • 包裝 IInternalExtenderProvider 函式項目子類型的實作必須委派給其內部項目子類型。 特別是,實作 GetExtenderNames 需要從內部項目子類型取得名稱字串,然後串連想要新增為擴充器的字串。

  • 包裝 IVsProjectCfgProvider 函式專案子類型的實作必須具現化 IVsProjectFlavorCfg 其內部專案子類型的物件,並將其保留為私用委派,因為只有基底專案的項目組態物件直接知道包裝函式專案子類型組態物件存在。 外部專案子類型一開始可以選擇想要直接處理的組態介面,然後將其餘專案委派給內部專案子類型的實作 get_CfgType

支援介面

基底專案會委派支援專案子類型所新增介面的呼叫,以擴充其實作的各個層面。 這包括擴充專案組態對象和各種屬性瀏覽器物件。 呼叫最外層項目子類型匯總工具的 上 punkOuterIUnknown即可擷取QueryInterface這些介面。

介面 項目子類型
IVsProjectFlavorCfg 允許項目型態:

- 提供 的實作 IVsDeployableProjectCfg
- 允許項目子類型提供自己的 實作 IVsDebuggableProjectCfg,以控制調試程序的啟動。
- 藉由適當處理案例的實作QueryDebugLaunchDBGLAUNCH_DesignTimeExprEval停用設計時間表達式評估。
IInternalExtenderProvider 允許項目型態:

- 擴充 VSHPROPID_BrowseObject 專案的 ,以新增或移除專案的組態獨立屬性。
- 擴充項目的項目自動化物件 (VSHPROPID_ExtObject) 。

上述屬性值取自 __VSHPROPID2 列舉。
IVsCfgBrowseObject 允許項目子類型對應回 IVsCfg 指定專案組態瀏覽物件的物件。
IVsBrowseObject 允許專案子類型對應回 IVsHierarchyVSITEMID 對象,因為專案組態瀏覽物件。
IPersistXMLFragment 允許項目子類型將任意 XML 結構化數據保存到項目檔 (.vbproj 或 .csproj)。 MSBuild 看不到此數據。
IVsBuildPropertyStorage 允許項目型態:

- 新增要保存的 MSBuild 屬性。
- 從 MSBuild 移除不必要的屬性。
- 查詢 MSBuild 屬性的目前值。
- 變更 MSBuild 屬性的目前值。

另請參閱