共用方式為


專案子型別設計

專案子類型可讓 VSPackages 延伸 Microsoft 建置引擎 (MSBuild) 為基礎的專案。 使用彙總可以讓您重複使用大部分受管理的核心專案系統中實作的Visual Studio卻仍然來自訂特定案例的行為。

下列主題詳細說明基本的設計與實作專案子類型:

  • 專案子類型的設計。

  • 多層級的彙總。

  • 支援的介面。

專案子型別設計

專案子類型的初始設定,來彙總主達成IVsHierarchyIVsProject物件。 此彙總可以讓您覆寫或增強的基底的專案功能的大部分專案子類型。 專案子類型取得初次出現的處理屬性使用IVsHierarchy,命令使用IOleCommandTargetIVsUIHierarchy,並使用的專案項目管理IVsProject3。 此外,也可以擴充專案子類型:

  • 專案組態的物件。

  • 組態相關的物件。

  • 瀏覽] 組態無關的物件。

  • 專案的自動化物件。

  • 專案自動化屬性集合。

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

原則檔

Visual Studio環境提供的擴充基底的專案系統在原則檔實作專案子類型與範例。 原則檔允許的外形Visual Studio環境,藉由管理功能,包括 [方案總管] 中, 加入專案對話方塊中, 加入新項目 對話方塊中,並屬性對話方塊。 覆寫原則子型別,並增強了這些功能,透過IVsFilterAddProjectItemDlgIOleCommandTargetIVsUIHierarchy的實作。

彙總機制

環境的專案子類型彙總機制可支援多個層級的彙總,因此可允許進階實作來進一步 flavoring flavored 的專案的子型別。 子也支援專案的物件類型,例如IVsProjectFlavorCfg,設計用來允許多個層級的分層。 為了與 COM 與 COM 的條件約束彙總規則、 專案的子型別和基底的專案必須相互合作地進行程式設計,讓內部的子型別或基底的專案,以適當地加入委派方法呼叫,和管理參考計數。 也就是要被聚合的專案必須設計用來支持集合。

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

多層次的專案子類型

Visual Studio 多層 projectflavor 圖形

多層級專案的子型別集合是由三個層級,基底的專案,這是依專案的子型別,那麼進一步彙總的進階的專案子類型所組成。 圖的重點在於某些支援的介面所提供的一部份Visual Studio專案子類型的架構。

部署機制

基底的專案系統的許多功能增強專案子類型,包括部署機制。 專案子類型會影響所實作的介面設定的部署機制 (例如IVsDeployableProjectCfgIVsBuildableProjectCfg),藉由呼叫 QueryInterface 上擷取IVsProjectCfgProvider。 在此案例中的專案子類型] 與 [進階的專案子類型加入不同的設定的實作,基底的專案會呼叫QueryInterface上的進階的專案子類型IUnknown。 如果內嵌專案子類型,包含組態實作的基底的專案,進階的專案子類型是委派實作所提供的內嵌專案子類型。 若要保存從一個彙總層級的狀態到另一種機制,以實作專案子類型的所有層級IPersistXMLFragment來保存非建置到專案檔相關的 XML 資料。 如需詳細資訊,請參閱 MSBuild 專案檔中的保存資料IInternalExtenderProvider會實作為一種機制,若要自動化的擴充項擷取專案子類型。

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

專案子類型自動化擴充項。

VS 專案類別自動擴充項圖形

專案子類型可以擴充自動化物件模型,進一步擴充基底的專案系統。 這些無誤 DTE automation 物件的一部份,且用來擴充 [專案] 物件中, ProjectItem物件,並Configuration物件。 如需詳細資訊,請參閱 擴充物件模型的基底的專案

多層級的彙總

包裝較低的層級專案子類型的專案子型別實作必須相互合作地設計以允許內嵌專案子類型,才能正確執行。 一份程式設計責任包括:

  • IPersistXMLFragment包裝內部的子類型的專案子類型的實作必須委派給IPersistXMLFragment內嵌專案的子型別實作兩個LoadSave方法。

  • IInternalExtenderProvider的包裝函式專案子型別實作必須委派,其內部的專案子類型。 特別是實作GetExtenderNames需要從內嵌專案的子型別中取得之名稱的字串,然後將它想要加入做為擴充項的字串連接起來。

  • IVsProjectCfgProvider的包裝函式專案子型別實作必須具現化IVsProjectFlavorCfg物件,其內部的專案子類型,而且保留為私用的委派,因為只有基底專案的專案組態物件直接知道包裝函式專案子類型的組態物件是否存在。 外部專案的子型別可以一開始選擇要直接處理設定介面,並再委派至內嵌專案子類型實作其他get_CfgType

支援的介面

基底的專案就是委派呼叫支援介面加入專案的子型別,以擴充它的實作的各種層面。 這包括擴充專案組態的物件和屬性瀏覽器的不同物件。 這些介面會擷取藉由呼叫QueryInterface上punkOuter (變數的指標, IUnknown) 的最外層的專案子類型彙總工具。

介面

專案子類型

IVsProjectFlavorCfg

可讓專案的子型別為:

IInternalExtenderProvider

可讓專案的子型別為:

上述的屬性值取自__VSHPROPID2列舉型別。

IVsCfgBrowseObject

可讓專案的子型別對應至IVsCfg給定專案組態瀏覽的物件的物件。

IVsBrowseObject

可讓專案的子型別對應至IVsHierarchyVSITEMID物件,指定專案設定瀏覽的物件。

IPersistXMLFragment

可讓專案的子型別來保存專案檔 (.vbproj 或.csproj) 的任意結構化的 XML 資料。 這項資料是看不到 MSBuild。

IVsBuildPropertyStorage

可讓專案的子型別為:

  • 加入新的 MSBuild 屬性,可保存。

  • 從 MSBuild 移除不必要的屬性。

  • 目前的值,MSBuild 屬性的查詢。

  • 變更目前的 MSBuild 屬性值。

請參閱

參考

__VSPROPID

__VSPROPID2