次の方法で共有


方法 : CodeModel オブジェクトを使用して C# クラスを作成する

更新 : 2007 年 11 月

CodeModel2 オブジェクト階層には、コードを自動的に生成するための一連のメソッドが含まれています。コードを手動で入力するのが一般的ですが、このプロセスの一部を自動化すると便利なケースもあります。自動化することで次の利点があります。

  • 名前付け規則が強制的に使用されます。

  • ドキュメント標準が強制的に使用されます。

  • 標準化されたプロジェクトが作成できます。

この手順は、アドイン プロジェクトの作成方法を理解していることを前提としています。詳細については、「アドインおよびウィザードの作成」を参照してください。

次のプロシージャのクラスは、新しいソース ファイルに含まれます。メソッドは後でクラスに追加されます。

x6h10s6x.alert_note(ja-jp,VS.90).gifメモ :

使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

プロジェクトに新しいソース ファイルを追加するには

  1. Visual C# を使用して、Visual Studio アドイン プロジェクトを作成します。

  2. [プロジェクト] メニューの [参照の追加] をクリックし、[.NET] タブをクリックします。[VSLangProj]、[VSLangProj2]、および [VSLangProj80] を選択し、[OK] をクリックします。

  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. AddAClass メソッドを OnConnection メソッドの直後に追加します。

    public void AddAClass(DTE2 dte)
    {
    }
    
  5. AddAClass メソッドに次のコードを追加して、プロジェクトに新しい空のコード ファイルを追加します。

    CodeFile テンプレートは、Visual Studio と一緒にインストールされているため、GetProjectItemTemplate メソッドを使用して指定できます。メソッドは、2 つのパラメータを受け取ります。1 つは検索対象の言語テンプレート、もう 1 つは検索結果のプロジェクト項目のファイル名です。プロジェクト項目は、AddFromTemplate メソッドを使用して作成されます。

    この例を実行する前に、proj = soln.Projects.Item(1); というコードのために、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) で 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 メソッドを使用し、 Games 名前空間に Chess クラスを追加します。AddClass メソッドは、CodeClass インスタンスへの参照を返します。このインスタンスを使用して、プロパティおよびメソッドをクラスに追加できます。

    games = fcm.AddNamespace("Games", -1);
    CodeClass2 chess;
    

メソッドを定義するには

  • AddFunction メソッドを使用し、Chess クラスに Move メソッドを追加します。このメソッドの 1 番目の引数で、作成した関数の名前を指定します。演算子およびコンストラクタも AddFunction メソッドを使用して追加されるため、2 番目の引数で、作成した関数の型を決定します。3 番目の引数は、関数の戻り値の型を指定し、メソッドのシグネチャとしてそのまま置き換えられます。

    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 クラスのコードを上記のプログラム例で置き換えます。この例の実行方法の詳細については、「方法 : アドイン マネージャを使用してアドインを制御する」を参照してください。

参照

処理手順

方法 : CodeModel オブジェクトを使用して Visual Basic コードを分析する

概念

Visual Basic アプリケーションおよび C# アプリケーションの CodeModel オブジェクトの概要

コード モデルを使用したコードの調査 (Visual Basic)

コード モデルを使用したコードの調査 (Visual C#)