今回はSystem.CodeDom名前空間 のクラスたちで遊ぶ。CodeDomのクラスを用いるとソースコードの構成をクラスで表現することが出来る。例のごとくHelloWorldを作成してみる。
CodeCompileUnit compileiUnit = new CodeCompileUnit();
//名前空間追加
CodeNamespace sampleNamespace = new CodeNamespace("CodeDomSample");
compileiUnit.Namespaces.Add(sampleNamespace);
//System名前空間をインポート
CodeNamespaceImport systemImport = new CodeNamespaceImport("System");
sampleNamespace.Imports.Add(systemImport);
//クラス追加
CodeTypeDeclaration programType = new CodeTypeDeclaration("Program");
programType.IsClass = true;
sampleNamespace.Types.Add(programType);
//メソッド追加
CodeEntryPointMethod mainMethod = new CodeEntryPointMethod();
programType.Members.Add(mainMethod);
//メソッド内処理の設定
CodeMethodInvokeExpression hello = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("Console"),
"WriteLine",
new CodePrimitiveExpression("Hello World"));
CodeExpressionStatement consoleWriteStatement = new CodeExpressionStatement(hello);
mainMethod.Statements.Add(consoleWriteStatement);
大きな流れは
- CodeCompileUnitクラスのオブジェクトを生成
- CodeCompileUnitオブジェクトに名前空間を追加
- 名前空間オブジェクトにタイプ(クラス)を追加
- タイプオブジェクトにメンバ(メソッド)追加
- メソッドにステートメント(処理)を追加
これをCodeDomProviderクラスを継承したクラスに渡せばソースコードファイルを生成することができる。
private void GenerateCodeFile(CodeCompileUnit unit)
{
Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
string fileName = "HelloWorld." + provider.FileExtension;
using (System.IO.StreamWriter writer = new System.IO.StreamWriter(fileName))
{
System.CodeDom.Compiler.CodeGeneratorOptions options = new System.CodeDom.Compiler.CodeGeneratorOptions();
options.IndentString = " ";
provider.GenerateCodeFromCompileUnit(unit, writer, new System.CodeDom.Compiler.CodeGeneratorOptions());
writer.Close();
}
}
生成されたHelloWorldソースは以下
//------------------------------------------------------------------------------ //// このコードはツールによって生成されました。 // ランタイム バージョン:2.0.50727.1433 // // このファイルへの変更は、以下の状況下で不正な動作の原因になったり、 // コードが再生成されるときに損失したりします。 // //------------------------------------------------------------------------------ namespace CodeDomSample { using System; public class Program { public static void Main() { Console.WriteLine("Hello World"); } } }
auto-generatedのコメントは消せないのかな。
コメント
コメントを投稿