共用方式為


HOW TO:使用 CodeModel 物件建立 C# 類別

更新:2007 年 11 月

CodeModel2 物件階層架構具有一組完整的方法,可用來自動產生程式碼。雖然您通常會以手動方式輸入程式碼,不過在一些情況下您可能會想要自動化某些部分。自動化可允許您:

  • 強制命名規範。

  • 強制文件標準。

  • 建立標準化專案。

這個程序假設您已經知道如何建立增益集 (Add-In) 專案。如需詳細資訊,請參閱建立增益集和精靈

以下程序中的類別 (Class) 將包含在新的原始程式檔 (Source File) 中。稍後會在類別中加入一個方法。

注意事項:

根據目前使用的設定與版本,您所看到的對話方塊與功能表命令可能會與 [說明] 中所描述的不同。使用 [一般開發設定] 開發了這些程序。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定

若要將新的原始程式檔加入至專案

  1. 使用 Visual C# 建立 Visual Studio 增益集專案。

  2. 在 [專案] 功能表上按一下 [加入參考],再按一下 [.NET] 索引標籤,選取 [VSLangProj]、[VSLangProj2] 和 [VSLangProj80],然後再按 [確定]。

  3. 將下列方法呼叫加入至 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);
    }
    
  4. 緊接在 OnConnection 方法的下面加入 AddAClass 方法。

    public void AddAClass(DTE2 dte)
    {
    }
    
  5. 將下列程式碼加入至 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 程式碼

概念

Visual Basic 和 C# 應用程式的 CodeModel 物件概觀

使用程式碼模型探索程式碼 (Visual Basic)

使用程式碼模型探索程式碼 (Visual C#)