C#相談室

このエントリーをはてなブックマークに追加
247デフォルトの名無しさん
1つ質問させてください。

System.CodeDOMの簡単な使い方を知りたいです。
クラス名を見てると面白そうなんですけど、具体的な使い方がよくわかりません。

よろしくお願いします。
248名無しさん♯:2001/04/29(日) 11:42
>>247
確かにおもしろそうなんだけど、ものすごくめんどくさいよ。(藁
とりあえず、簡単なサンプル出しとくね。

using System;
using System.CodeDOM;
using System.CodeDOM.Compiler;
using System.IO;
using System.Reflection;

class CodeDOMSample
{
  // Hello World プログラムの定義。
  public static CodeNamespace CreateCode() {

    // using System; の部分。
    CodeNamespace namespace1 = new CodeNamespace();
    namespace1.Imports.Add(new CodeNamespaceImport("System"));

    // class Hello の部分。
    CodeClass class1 = new CodeClass("Hello");
    class1.Attributes = TypeAttributes.NotPublic;

    // public static void Main() の部分。
    CodeMemberMethod method1 = new CodeMemberMethod();
    method1.Name = "Main";
    method1.Attributes = MemberAttributes.Public | MemberAttributes.Static;

    // Console.WriteLine("Hello World!!"); の部分。
    CodeStatement statement1 = new CodeMethodInvokeStatement(
      new CodeTypeReferenceExpression("Console"),
      "WriteLine",
      new CodeExpression[] { new CodeLiteralExpression("\"Hello World!!\"") }
    );

    method1.Statements.Add(statement1);
    class1.Members.Add(method1);
    namespace1.Classes.Add(class1);

    return namespace1;
  }

  public static void Main() {
    CodeNamespace code = CreateCode();

    ICodeGenerator generator;
    TextWriter writer;

    // C# のソースを生成。
    generator = new CSharpCodeGenerator();
    writer = new StreamWriter(File.OpenWrite("hello.cs"));
    generator.GenerateCodeFromNamespace(writer, code);
    writer.Close();

    // VB のソースを生成。
    generator = new VBCodeGenerator();
    writer = new StreamWriter(File.OpenWrite("hello.vb"));
    generator.GenerateCodeFromNamespace(writer, code);
    writer.Close();
  }
}
249デフォルトの名無しさん:2001/04/29(日) 16:18
>248
サンプルまで作っていただき、ありがとうございます。

なるほど、コードの構造を抽象的に記述して、
あとは好きな言語に落とせるわけですね。

XMLと組み合わせてコードを自動生成するなんてことを
想定しているのでしょうね。

とにかく、ありがとうございました。