Visual Basic 和 C# 應用程式的 CodeModel 物件概觀
您可能會需要以程式設計方式檢視 Visual Basic 或 Visual C# 應用程式中的程式碼結構。或許您想要知道在應用程式中定義的命名空間及其巢狀關聯性,或者您可能想要建立一份文件,列出類別及其公用成員做為文件的基礎。
CodeModel2 物件是能夠用來存取應用程式中程式碼的一般擴充性物件。CodeModel2 物件並不會提供程式碼的文字清單,而是提供表示程式碼項目之物件的巢狀集合。例如,程式碼中的每個命名空間都是以 CodeNamespace 物件表示。與專案有關聯的 CodeModel2 物件是由 CodeModel 屬性存取。
FileCodeModel2 物件是能夠用來存取單一原始程式檔 (Source File) 中程式碼的一般擴充性物件。應用程式中的每個原始程式檔都是以 ProjectItem 物件表示,而與專案項目有關聯的 FileCodeModel2 物件可以在 FileCodeModel 屬性中找到。
CodeModel2 和 FileCodeModel2 物件分別提供了 CodeModel2.CodeElements 和 FileCodeModel.CodeElements 屬性,此屬性是 CodeElement2 物件的集合。Visual Basic 和 Visual C# 支援 CodeModel2 和 FileCodeModel 物件的方式有些微的不同。如需 Visual Basic 實作 (Implementation) 的範例,請參閱使用程式碼模型探索程式碼 (Visual Basic) 和 HOW TO:使用 CodeModel 物件分析 Visual Basic 程式碼。如需 Visual C# 實作 (Implementation) 的範例,請參閱使用程式碼模型探索程式碼 (Visual C#) 和 HOW TO:使用 CodeModel 物件建立 C# 類別。
有些語言並不會實作整個 Visual Studio 程式碼模型。[說明] 主題指出所發生的例外狀況。程式碼模型實作之間的大多數差異都是因為不同語言的功能差異所導致的。例如,您不能在 Visual Basic 或 Visual C# 的 CodeNamespace 物件中加入函式,因為只有 Visual C++ 才有提供最上層的函式定義。
主要的程式碼模型物件會列在下表中。若要查看每個物件的方法和屬性清單,請按一下各連結。
型別 |
描述 |
---|---|
代表原始程式檔中的命名空間建構。 |
|
代表原始程式碼中的結構。 |
|
代表原始程式碼中的介面。 |
|
代表原始程式碼中的某一類別。 |
|
代表原始程式碼中的列舉型別。 |
|
定義原始程式檔中的變數建構。 |
|
代表原始程式碼中的委派。 |
|
代表原始程式檔中的程式碼項目或建構。 |
|
模組化程式碼事件項目。 |
|
定義原始程式檔中的屬性建構。 |
|
定義程式碼項目的屬性。 |
|
將用以匯入命名空間的陳述句用法予以模式化。 |
|
代表原始程式檔中的函式建構。 |
|
定義函式、屬性等項目的參數。 |
巢狀程式碼項目
應用程式中的程式碼項目是以巢狀架構的方式組織。例如,專案項目的 FileCodeModel2 可能會在其 CodeElements 集合中包含某個命名空間的程式碼項目,表示該命名空間的 CodeNamespace 物件可能會包含數個其他的程式碼項目,用來表示其 Members 屬性中的類別,而每個 CodeClass2 項目又可能會包含表示屬性的程式碼項目 (CodeProperty2 物件) 和表示方法的程式碼項目 (CodeFunction2 物件)。擷取巢狀程式碼項目的方法要視程式碼項目的型別而定,這在接下來的章節中會加以說明。
程式碼項目類別
CodeElement2 類別是表示專案項目 (原始程式檔) 中所有程式碼項目的基底類別。許多類別都是衍生自 CodeElement2,用來表示應用程式中的各種建構,包括命名空間、類別、屬性、方法和事件。程式碼項目有兩種可擴充的分類:一種是用來表示型別的程式碼項目,另一種不是用來表示型別的程式碼項目。
應用程式中有些程式碼項目是用來表示型別。這些程式碼項目是衍生自 CodeType 物件和 CodeElement2 物件:
您可以用 IsCodeType 屬性來判斷 CodeElement2 物件的參考是否屬於其中一種型別。若要找出這些型別的巢狀程式碼項目,請使用會傳回 CodeElements 集合的 Members 屬性。HOW TO:使用 CodeModel 物件分析 Visual Basic 程式碼包含可尋找專案中所有類別的範例。
如何尋找以巢狀方式置於程式碼項目其他型別之下的程式碼項目,要視巢狀程式碼項目的型別而定。例如,由於屬性只具有 Get 和 Set 方法,因此與屬性有關聯的 CodeProperty2 物件就具有會傳回 CodeFunction2 項目的 Getter 和 Setter 屬性。下列清單顯示用來找出程式碼項目型別的巢狀程式碼項目的一些屬性。
型別 |
屬性 |
---|---|
CodeFunction |
|
CodeNamespace |
|
CodeProperty |
來自外部參考的程式碼項目
您的程式碼可能包含專案參考所定義型別的型別宣告 (專案參考是透過 [加入參考] 對話方塊或利用 References.Add 擴充性方法加入的)。 除了其名稱外,Visual Basic 專案系統無法解析表示這些參考的 CodeTypeRef2 物件。因此,如果您嘗試使用與參考有關聯之 CodeElement2 物件的任何其他屬性或方法 (除了 Name 屬性之外),系統將會擲回「未實作」例外狀況。這些參考稱為「僅型別名稱」程式碼項目。表示外部參考的 CodeType 物件具有設定為 vsCMInfoLocationNone 的 InfoLocation 屬性。
編譯器錯誤和 CodeModel 物件
當您撰寫保留 CodeElement2 物件之參考的程式碼時,應該要了解基礎原始程式碼可能會在您持用參考時發生變更。程式碼項目可能會被刪除、重新命名或產生編譯器錯誤。發生這種情況時,對 CodeElement2 物件發出的呼叫會傳回「發生例外狀況於 HRESULT: 0x80047E2C」的錯誤訊息。
請參閱
工作
HOW TO:使用 CodeModel 物件分析 Visual Basic 程式碼
Visual Basic 和 Visual C# 擴充性疑難排解