HOW TO:使用 CodeModel 物件建立 C# 類別
CodeModel2 物件階層架構具有一組完整的方法,可用來自動產生程式碼。雖然您通常會以手動方式輸入程式碼,不過在一些情況下您可能會想要自動化某些部分。自動化可允許您:
強制命名規範。
強制文件標準。
建立標準化專案。
這個程序假設您已經知道如何建立增益集 (Add-In) 專案。如需詳細資訊,請參閱建立增益集和精靈。
以下程序中的類別 (Class) 將包含在新的原始程式檔 (Source File) 中。稍後會在類別中加入一個方法。
注意事項 |
---|
根據您目前使用的設定或版本,您所看到的對話方塊與功能表指令可能會與 [說明] 中描述的不同。使用 [一般開發設定] 開發了這些程序。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定。 |
若要將新的原始程式檔加入至專案
使用 Visual C# 建立 Visual Studio 增益集專案。
在 [專案] 功能表上按一下 [加入參考],再按一下 [.NET] 索引標籤,選取 [VSLangProj]、[VSLangProj2] 和 [VSLangProj80],然後再按 [確定]。
將下列方法呼叫加入至 OnConnection 方法。
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); }
緊接在 OnConnection 方法的下面加入 AddAClass 方法。
public void AddAClass(DTE2 dte) { }
將下列程式碼加入至 AddAClass 方法,以將新的空白程式碼檔加入至專案。
CodeFile 範本是隨著 Visual Studio 一起安裝,您可以使用 GetProjectItemTemplate 方法找到此範本。這個方法需要兩個參數:一個是您要搜尋的語言範本,另一個是產生之專案項目的檔案名稱。專案項目是使用 AddFromTemplate 方法建立的。
在執行這個範例之前,proj = soln.Projects.Item(1); 程式碼需要在 Visual Studio 整合式開發環境 (IDE) 中開啟 Visual C# 方案。
Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs");
若要將命名空間加入至原始程式檔
請加入下列程式碼,以將命名空間加入至原始程式檔。
FileCodeModel 屬性包含表示檔案中所有程式碼項目的 FileCodeModel2 物件參考。FileCodeModel2 物件提供了幾個方法,可用來將程式碼項目加入至原始程式檔。AddNamespace 方法會傳回 CodeNamespace 物件。您將會使用這個 CodeNamespace 參考將類別定義加入至原始程式檔。
FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games;
若要將類別加入至命名空間
使用 AddClass 方法,將 Chess 類別加入至 Games 命名空間。AddClass 方法會傳回 CodeClass 執行個體的參考,您可以用它來將屬性和方法加入至類別。
games = fcm.AddNamespace("Games", -1); CodeClass2 chess;
若要定義方法
使用 AddFunction 方法,將 Move 方法加入至 Chess 類別。這個方法的第一個引數會指定所建立之函式的名稱;第二個引數會決定所建立之函式的型別,因為運算子和建構函式 (Constructor) 也是使用 AddFunction 方法加入的;第三個引數指定函式的傳回型別 (Return Type),而且正好會被方法簽章替代。
if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); }
由以上這些程序產生的原始程式檔顯示如下。
namespace Games { class Chess { int Move(bool IsOK) { return default(int); } } }
增益集程式碼顯示如下。
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); } public void AddAClass(DTE2 dte) { Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs"); FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games; try { // Add a namespace. games = fcm.AddNamespace("Games", -1); CodeClass2 chess; if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); } } catch (Exception ex) { MessageBox.Show("Failed to add a code model element, because " + ex.Message); } }
Public Sub OnConnection(ByVal application As Object, _ ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _ ByRef custom As Array) Implements IDTExtensibility2.OnConnection _applicationObject = CType(application, DTE2) _addInInstance = CType(addInInst, AddIn) AddAClass(_applicationObject) End Sub Public Sub AddAClass(ByVal dte As DTE2) Dim proj As Project Dim csItemTemplatePath As String Dim soln As Solution2 soln = CType(_applicationObject.Solution, Solution2) ' Open a C# solution in the Visual Studio IDE before ' running this add-in. proj = soln.Projects.Item(1) Dim pi As ProjectItem csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp") proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile34.cs") pi = proj.ProjectItems.Item("MyFile34.cs") Dim fcm As FileCodeModel2 = CType(pi.FileCodeModel, FileCodeModel2) Dim games As CodeNamespace Try ' Add a namespace. games = fcm.AddNamespace("Games") Dim chess As CodeClass2 If Not games Is Nothing Then ' Add a class to the namespace. chess = CType(games.AddClass("Chess"), CodeClass2) ' Add a method with a parameter to the class. Dim move As CodeFunction2 move = CType(chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, _ "int"), CodeFunction2) move.AddParameter("IsOK", "bool") End If Catch e As Exception MsgBox("Failed to add a code model element, because " & _ e.ToString()) End Try End Sub
以上述範例程式碼取代 OnConnection 類別中的程式碼。如需如何執行這個範例的詳細資訊,請參閱 HOW TO:使用增益集管理員來控制增益集。
請參閱
工作
HOW TO:使用 CodeModel 物件分析 Visual Basic 程式碼