CodeDOM の使用方法

CodeDOM には一般的なさまざま種類のソース コード要素を表す型が用意されています。 オブジェクト グラフをアセンブルする CodeDOM 要素を使用すると、ソース コード モデルを構築するプログラムをデザインできます。 このオブジェクト グラフは、サポートされているプログラミング言語用の CodeDOM コード ジェネレーターを使用して、ソース コードとしてレンダリングできます。 また、CodeDOM を使用して、ソース コードをバイナリ アセンブリにコンパイルすることもできます。

CodeDOM の一般的な使用方法の例は次のとおりです。

  • テンプレートを使ったコード生成。ASP.NET、XML Web サービス クライアント プロキシ、コード ウィザード、デザイナー、またはその他のコード出力機構のためのコードを生成します。

  • 動的コンパイル。1 つ以上の言語でのコードのコンパイルをサポートします。

CodeDOM グラフの構築

System.CodeDom 名前空間には、言語の構文に依存しない、ソース コードの論理構造を表すクラスが用意されています。

CodeDOM グラフの構造

CodeDOM グラフの構造はコンテナーのツリーに似ています。 コンパイル可能な CodeDOM グラフの最上位のコンテナー、つまりルートのコンテナーは CodeCompileUnit です。 ソース コード モデルの各要素は、CodeDOM グラフ内の CodeObject のプロパティを通じて CodeDOM グラフにリンクされている必要があります。

サンプルの Hello World プログラム用ソース コード モデルの構築

単純な Hello World アプリケーションのコードを表す CodeDOM オブジェクト グラフを構築する手順の例を次に示します。 このコード サンプルのソース コード例全体については、「System.CodeDom.Compiler.CodeDomProvider」を参照してください。

コンパイル単位の作成

CodeDOM は、CodeCompileUnit と呼ばれるオブジェクトを定義します。このオブジェクトでは、コンパイルするソース コードをモデル化した CodeDOM オブジェクト グラフを参照できます。 CodeCompileUnit には、属性、名前空間、およびアセンブリへの参照を格納するためのプロパティが用意されています。

CodeDomProvider クラスから派生する CodeDom プロバイダーには、CodeCompileUnit が参照するオブジェクト グラフを処理するメソッドが含まれています。

簡単なアプリケーション用のオブジェクト グラフを作成するには、ソース コード モデルをアセンブルし、生成されたオブジェクト グラフを CodeCompileUnit から参照する必要があります。

新しいコンパイル単位を作成するには、次の例に示す構文を使います。

Dim compileUnit As New CodeCompileUnit()
CodeCompileUnit compileUnit = new CodeCompileUnit();
CodeCompileUnit^ compileUnit = gcnew CodeCompileUnit();

CodeSnippetCompileUnit には、既に対象言語で記述されているソース コードのセクションを格納できますが、この単位は別の言語にはレンダリングできません。

名前空間の定義

名前空間を定義するには、CodeNamespace を作成してから、適切なコンストラクターを使用するか Name プロパティを設定することにより、定義する名前空間の名前を割り当てます。

Dim samples As New CodeNamespace("Samples")
CodeNamespace samples = new CodeNamespace("Samples");
CodeNamespace^ samples = gcnew CodeNamespace("Samples");

名前空間のインポート

名前空間のインポート ディレクティブを名前空間に追加するには、インポートする名前空間を示す CodeNamespaceImportCodeNamespace.Imports コレクションに追加します。

System 名前空間のインポートを、samples という名前の CodeNamespaceImports コレクションに追加するコードを次に示します。

samples.Imports.Add(new CodeNamespaceImport("System"))
samples.Imports.Add(new CodeNamespaceImport("System"));
samples->Imports->Add(gcnew CodeNamespaceImport("System"));

コード要素のオブジェクト グラフへのリンク

CodeDOM グラフを形成するすべてのコード要素は、CodeDOM グラフのルート オブジェクトのプロパティから直接参照される要素間の一連の参照によって、ツリーのルート要素である CodeCompileUnit にリンクする必要があります。 オブジェクトをコンテナー オブジェクトのプロパティに設定し、コンテナー オブジェクトからの参照を確立します。

samples CodeNamespace をルートの CodeCompileUnitNamespaces コレクション プロパティに追加するステートメントを次に示します。

compileUnit.Namespaces.Add(samples)
compileUnit.Namespaces.Add( samples );
compileUnit->Namespaces->Add( samples );

型の定義

CodeDOM を使ってクラス、構造体、インターフェイス、または列挙体を宣言するには、新しい CodeTypeDeclaration を作成し、名前を割り当てます。 このために、Name プロパティを設定するコンストラクターのオーバーロードを使用する例を次に示します。

Dim class1 As New CodeTypeDeclaration("Class1")
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
CodeTypeDeclaration^ class1 = gcnew CodeTypeDeclaration("Class1");

名前空間に型を追加するには、名前空間に追加する型を表す CodeTypeDeclaration を、CodeNamespaceTypes コレクションに追加します。

class1 という名前のクラスを samples という名前の CodeNamespace に追加する例を次に示します。

samples.Types.Add(class1)
samples.Types.Add(class1);
samples->Types->Add(class1);

クラスへのクラス メンバーの追加

System.CodeDom 名前空間には、クラス メンバーを表すために使用できるさまざまな要素が用意されています。 各クラス メンバーは、CodeTypeDeclarationMembers コレクションに追加できます。

実行可能プログラムのコード エントリ ポイント メソッドの定義

実行可能プログラムのコードを記述する場合は、プログラムの実行を開始するメソッドを表す CodeEntryPointMethod を作成して、プログラムのエントリ ポイントを指定する必要があります。

"Hello World!" と出力するための System.Console.WriteLine を呼び出す CodeMethodInvokeExpression を格納しているエントリ ポイント メソッドを定義する例を次に示します。

Dim start As New CodeEntryPointMethod()
Dim cs1 As New CodeMethodInvokeExpression( _
    New CodeTypeReferenceExpression("System.Console"), _
    "WriteLine", new CodePrimitiveExpression("Hello World!"))
start.Statements.Add(cs1)
CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
    new CodeTypeReferenceExpression("System.Console"),
    "WriteLine", new CodePrimitiveExpression("Hello World!"));
start.Statements.Add(cs1);
CodeEntryPointMethod^ start = gcnew CodeEntryPointMethod();
CodeMethodInvokeExpression^ cs1 = gcnew CodeMethodInvokeExpression(
    gcnew CodeTypeReferenceExpression("System.Console"),
    "WriteLine", gcnew CodePrimitiveExpression("Hello World!"));
start->Statements->Add(cs1);

Start という名前のエントリ ポイント メソッドを class1 の Members コレクションに追加するステートメントを次に示します。

class1.Members.Add( start)
class1.Members.Add( start );
class1->Members->Add(start);

これで、CompileUnit という名前の CodeCompileUnit に、簡単な Hello World プログラムの CodeDOM グラフが追加されました。 CodeDOM グラフからのコードの生成およびコンパイルについては、「CodeDOM グラフからのソース コードの生成およびプログラムのコンパイル」を参照してください。

CodeDOM グラフの構築に関する詳細

CodeDOM では、共通言語ランタイムをサポートするプログラミング言語の一般的なさまざまな種類のコード要素をサポートします。 CodeDOM は、プログラミング言語のすべての機能を表す要素を提供するようにはデザインされていません。 CodeDOM 要素で簡単に表すことができないコードは、CodeSnippetExpressionCodeSnippetStatementCodeSnippetTypeMember、または CodeSnippetCompileUnit にカプセル化できます。 ただし、CodeDOM ではコードを自動的に他の言語に変換することはできません。

CodeDOM のそれぞれの型については、System.CodeDom 名前空間の説明を参照してください。

特定の種類のコード要素を表す CodeDOM 要素を探すための一覧については、「CodeDOM クイック リファレンス」を参照してください。