專案擴充性簡介
更新:2007 年 11 月
只要在任何專案中加入下列 VSLangProj 組件的參考,就可以使用物件模型 (Object Model):VSLangProj.dll、VSLangProj2.dll、VSLangProj80.dll 和 VSLangProj90.dll 組件。如需詳細資訊,請參閱 HOW TO:在 Visual Studio 中新增或移除參考 (Visual Basic)。這表示物件模型可使用於巨集、增益集和任何需要擴充 IDE 或自動化 IDE 的專案中。巨集是在巨集整合式開發環境中以 Visual Basic 所撰寫的。各主題中的範例都是用 Visual Basic 和 Visual C# 語言撰寫的。如需如何執行範例的詳細資訊,請參閱 HOW TO:編譯和執行 Automation 物件模型程式碼範例。增益集 (Add-In) 可以用任何一種 Visual Studio 裝載的語言撰寫,例如 Visual Basic、Visual C#、Visual C++ 和 Visual J#。VSLangProj、VSLangProj2、VSLangProj80 和 VslangProj90 成員的參考主題包含以上各種語言的語法。如需 Automation 專案類型和 Automation 功能的描述資訊,請參閱建立增益集和精靈。
VSLangProj、VSLangProj2、VSLangProj80 和 VSLangProj90 命名空間
這些命名空間包含 Visual Basic、Visual C# 和 Visual J# 專案的所有類別、介面和列舉型別 (Enumeration)。如需命名空間中所有物件的完整清單,請參閱 Visual Basic 和 Visual C# 的專案擴充性物件模型。
使用 VSLangProj 組件和 EnvDTE 組件時可能發生的錯誤
如果建立的專案要參考一個或多個 VSLangProj 組件和 EnvDTE 組件,在執行階段可能偶爾會收到下列錯誤訊息:
「未處理的例外狀況: System.IO.FileNotFoundException: 載入檔案 'EnvDTE, Version=7.0.3300.0 時發生錯誤」
這個錯誤是由於執行階段型別解析衝突所引起。換句話說,Visual Studio 2005 中所附的 EnvDTE 組件是 8.0.xx 版,但是專案的組態參考卻要尋找此組件的舊版,也就是 7.0.xx 版。若要修正這個問題,必須在專案的組態 (.config) 檔中加入新版 EnvDTE 組件的繫結重新導向。這麼做才能讓 Visual Studio 載入新版的 EnvDTE 組件,而且不再發生錯誤。
若要這麼做,請在專案中加入「應用程式組態檔」,然後以下列程式碼取代其內容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-
com:asm.v1" appliesTo="v2.0.50318">
<dependentAssembly>
<assemblyIdentity name="EnvDTE" publicKeyToken=
"b03f5f7f11d50a3a"/>
<bindingRedirect oldVersion="7.0.3300.0"
newVersion="8.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
VSProject2 物件
這個物件可以用來存取擴充性模型中的其他物件。DTE 物件是 Visual Studio Automation 模型中的最上層物件。在一般擴充性模型中,專案是以泛型 Project 物件表示。Project 物件具有 Object 屬性。屬性的型別則是在執行階段時依專案語言而決定。在 Visual Basic、Visual C# 或 Visual J# 專案中,Object 屬性會傳回 VSProject2 型別的物件。由於 Object 屬性的型別為 Object,所以您必須將參考轉換為 VSProject2 型別。在巨集中,如果第一個專案是 Visual Basic 專案,則型別轉換的程式碼應該像這樣:
Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj
Imports VSLangProj2
Imports VSLangProj80
Imports VSLangProj90
Dim proj As EnvDTE.Project
Dim vsproject As VSLangProj80.VSProject2
proj = DTE.Solution.Projects.Item(1)
vsproject = CType(proj.Object, VSLangProj80.VSProject2)
using EnvDTE;
using EnvDTE80;
using EnvDTE90;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
EnvDTE.Project proj;
VSLangProj80.VSproject2 vsproject;
proj = DTE2.Solution.Projects.Item(1);
vsproject = (VSLangProj80.VSProject2)proj;
有了 VSProject2 項目的參考之後,便可以管理專案的屬性、組態、檔案、資料夾、Imports 陳述式和參考。
如需詳細資訊,請參閱 VSProject2 物件簡介。
References 和 Reference 物件
包含在 VSProject2 物件中的 References 屬性會存放 Reference3 物件的集合。Reference3 物件表示專案參考,主要是支援 Remove 方法的唯讀物件。References 物件可以支援加入參考 (COM、.NET 組件、ActiveX 和其他專案) 以及引發事件 (加入、移除和變更參考)。
References 物件不包含專案的 Web 參考。專案的 Web 參考可經由存取 WebReferencesFolder 屬性的 ProjectItems 屬性來擷取。
如需詳細資訊和程式碼範例,請參閱 Reference 和 Reference3 物件、References 集合、References 屬性和 WebReferencesFolder 屬性。
Imports 物件
包含在 VSProject2 物件中的 Imports 屬性會保留適用於整個 Visual Basic 專案之 Imports 陳述式的集合。如果將 Imports 陳述式加入至此集合,就不需要將對應的 Imports 陳述式 (例如 Imports VSLangProj) 加入至程式碼檔。這個物件支援加入及移除 Imports 陳述式,並依加入和移除陳述式而引發事件。在 Visual C# 專案中沒有對等的項目,因此,如果將 VSProject2.Imports 屬性套用至 Visual C# 專案,將會傳回 Nothing 或 null。如需詳細資訊,請參閱 Imports。
VSProjectItem 和 BuildManager 物件
VSProjectItem 物件是指專案項目,相對於 VSProject2 物件所指的專案。在一般擴充性模型中,泛型 ProjectItem 物件表示專案項目。Object 屬性的型別為 Object,而在 Visual Basic 或 Visual C# 專案中,這個屬性的型別則為 VSProjectItem。在巨集中將物件轉換為 VSProjectItem 型別的程式碼應該像這樣:
Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj
Imports VSLangProj2
Imports VSLangProj80
Imports VSLangProj90
Dim pi As VSProjectItem
pi = CType(DTE2.Solution.Projects.Item(1).ProjectItems.Item(1)._
Object, VSProjectItem)
using EnvDTE;
using EnvDTE80;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
using VSLangProj90;
EnvDTE.Project proj;
VSLangProj.VSProjectItem pi;
Pi = (VSProject2)DTE2.Solution.Projects.Item(1).ProjectItems.Item(1).
Object;
VSProjectItem 物件包含連結至父代 (Parent) 專案項目和專案的屬性,以及強迫在該項目上執行自訂工具的方法。BuildManager 物件會處理自訂工具輸出。如需詳細資訊,請參閱 RunCustomTool 方法、BuildManager 物件簡介、VSProjectItem 物件和 BuildManager 物件。
Properties 屬性
一般擴充性模型在下列三個物件中具有 Properties 屬性:
Project 物件:這個物件中的屬性與 IDE 中專案 [屬性頁] 對話方塊之 [通用屬性] 索引標籤中的屬性相同。
Configuration 物件:這個物件中的屬性與 IDE 中專案 [屬性頁] 對話方塊之 [組態屬性] 索引標籤中的屬性相同。
ProjectItem 物件:這個物件中的屬性與在 [方案總管] 中選取專案項目之後出現在 [屬性] 視窗中的屬性相同。
在上述所有情況下,Properties 屬性都是 Property 型別之物件的集合。只要指定屬性以 1 起始的索引或屬性名稱,就可以從集合中取得 Property 物件。集合的內容則視語言別有所不同。在專案項目的案例中,內容將因項目是檔案或資料夾而有不同。