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 から参照する必要があります。
新しいコンパイル単位を作成するには、次の例に示す構文を使います。
CodeCompileUnit^ compileUnit = gcnew CodeCompileUnit();
CodeCompileUnit compileUnit = new CodeCompileUnit();
Dim compileUnit As New CodeCompileUnit()
CodeSnippetCompileUnit には、既に対象言語で記述されているソース コードのセクションを格納できますが、この単位は別の言語にはレンダリングできません。
名前空間を定義する
名前空間を定義するには、CodeNamespace を作成してから、適切なコンストラクターを使用するか Name プロパティを設定することにより、定義する名前空間の名前を割り当てます。
CodeNamespace^ samples = gcnew CodeNamespace("Samples");
CodeNamespace samples = new CodeNamespace("Samples");
Dim samples As New CodeNamespace("Samples")
名前空間をインポートする
名前空間のインポート ディレクティブを名前空間に追加するには、インポートする名前空間を示す CodeNamespaceImport を CodeNamespace.Imports コレクションに追加します。
System 名前空間のインポートを、samples
という名前の CodeNamespace の Imports コレクションに追加するコードを次に示します。
samples->Imports->Add(gcnew CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"))
コード要素をオブジェクト グラフにリンクする
CodeDOM グラフを形成するすべてのコード要素は、CodeDOM グラフのルート オブジェクトのプロパティから直接参照される要素間の一連の参照によって、ツリーのルート要素である CodeCompileUnit にリンクする必要があります。 オブジェクトをコンテナー オブジェクトのプロパティに設定し、コンテナー オブジェクトからの参照を確立します。
samples
CodeNamespace をルートの CodeCompileUnit の Namespaces コレクション プロパティに追加するステートメントを次に示します。
compileUnit->Namespaces->Add( samples );
compileUnit.Namespaces.Add( samples );
compileUnit.Namespaces.Add(samples)
型を定義する
CodeDOM を使ってクラス、構造体、インターフェイス、または列挙体を宣言するには、新しい CodeTypeDeclaration を作成し、名前を割り当てます。 このために、Name プロパティを設定するコンストラクターのオーバーロードを使用する例を次に示します。
CodeTypeDeclaration^ class1 = gcnew CodeTypeDeclaration("Class1");
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
Dim class1 As New CodeTypeDeclaration("Class1")
名前空間に型を追加するには、名前空間に追加する型を表す CodeTypeDeclaration を、CodeNamespace の Types コレクションに追加します。
class1
という名前のクラスを samples
という名前の CodeNamespace に追加する例を次に示します。
samples->Types->Add(class1);
samples.Types.Add(class1);
samples.Types.Add(class1)
クラス メンバーをクラスに追加する
System.CodeDom 名前空間には、クラス メンバーを表すために使用できるさまざまな要素が用意されています。 各クラス メンバーは、CodeTypeDeclaration の Members コレクションに追加できます。
実行可能プログラムのコード エントリ ポイント メソッドを定義する
実行可能プログラムのコードを記述する場合は、プログラムの実行を開始するメソッドを表す CodeEntryPointMethod を作成して、プログラムのエントリ ポイントを指定する必要があります。
"Hello World!" と出力するための System.Console.WriteLine を呼び出す CodeMethodInvokeExpression を格納しているエントリ ポイント メソッドを定義する例を次に示します。
CodeEntryPointMethod^ start = gcnew CodeEntryPointMethod();
CodeMethodInvokeExpression^ cs1 = gcnew CodeMethodInvokeExpression(
gcnew CodeTypeReferenceExpression("System.Console"),
"WriteLine", gcnew 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);
Dim start As New CodeEntryPointMethod()
Dim cs1 As New CodeMethodInvokeExpression( _
New CodeTypeReferenceExpression("System.Console"), _
"WriteLine", new CodePrimitiveExpression("Hello World!"))
start.Statements.Add(cs1)
Start
という名前のエントリ ポイント メソッドを class1
の Members コレクションに追加するステートメントを次に示します。
class1->Members->Add(start);
class1.Members.Add( start );
class1.Members.Add(start)
これで、CodeCompileUnit という名前の compileUnit
に、簡単な Hello World プログラムの CodeDOM グラフが追加されました。 CodeDOM グラフからのコードの生成およびコンパイルについては、「CodeDOM グラフからのソース コードの生成およびプログラムのコンパイル」を参照してください。
CodeDOM グラフの構築に関する詳細
CodeDOM では、共通言語ランタイムをサポートするプログラミング言語の一般的なさまざまな種類のコード要素をサポートします。 CodeDOM は、プログラミング言語のすべての機能を表す要素を提供するようにはデザインされていません。 CodeDOM 要素で簡単に表すことができないコードは、CodeSnippetExpression、CodeSnippetStatement、CodeSnippetTypeMember、または CodeSnippetCompileUnit にカプセル化できます。 ただし、CodeDOM ではコードを自動的に他の言語に変換することはできません。
CodeDOM のそれぞれの型については、System.CodeDom 名前空間の説明を参照してください。
特定の種類のコード要素を表す CodeDOM 要素を探すための一覧については、「CodeDOM Quick Reference」(CodeDOM クイック リファレンス) を参照してください。
.NET