LoginSignup
4
3

More than 3 years have passed since last update.

CodeDOMとは

Microsoftのサイトにはこう書いてあります

CodeDOM には一般的なさまざま種類のソース コード要素を表す型が用意されています。 オブジェクト グラフをアセンブルする CodeDOM 要素を使用すると、ソース コード モデルを構築するプログラムをデザインできます。 このオブジェクト グラフは、サポートされているプログラミング言語用の CodeDOM コード ジェネレーターを使用して、ソース コードとしてレンダリングできます。 また、CodeDOM を使用して、ソース コードをバイナリ アセンブリにコンパイルすることもできます。
CodeDOM の一般的な使用方法の例は次のとおりです。
・テンプレートを使ったコード生成。ASP.NET、XML Web サービス クライアント プロキシ、コード ウィザード、デザイナー、またはその他のコード出力機構のためのコードを生成します。
・動的コンパイル。1 つ以上の言語でのコードのコンパイルをサポートします。

要はテンプレートから実行ファイルを作れるたり、コードを動的にコンパイルできるわけです

今回はコンパイルする方法について説明します。

テンプレートで実行ファイルを生成する仕組み

余談ですがテンプレートからコード生成する方法も動的コンパイラを使っています。
そのため、実際はテンプレートからソースコードを生成しコンパイルしています。

コンパイルしてみる

今回生成するときに使うコードコード

C#
using System;

class Program
{
        static void Main(string[] args)
        {
                Console.Write("Hello CodeDom");
                Console.ReadKey();
        }
}

コード

C#
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Compile
{
    class Program
    {
        static void Main(string[] args)
        {
            //ソースコード
            string sauce= "using System;\r\n\r\nclass Program\r\n{\r\n" + "\tstatic void Main(string[] args)\n\r\t{\n\r\t\tConsole.Write(\"Hello CodeDom\");\n\r\t\tConsole.ReadKey();\n\r\t}\n\r}\r\n";

            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");//プロバイダの宣言と言語の設定

            CompilerParameters compiler = new CompilerParameters();

            // クラスライブラリの代わりに実行可能ファイルを生成します。
            compiler.GenerateExecutable = true;

            compiler.OutputAssembly =  @"";//出力パスを設定する

            // アセンブリを物理ファイルとして保存します。
            compiler.GenerateInMemory = false;

            // すべての警告をエラーとして扱うかどうかを設定します。
            compiler.TreatWarningsAsErrors = false;

            compiler.CompilerOptions = "/optimize";//オプション設定

           //使用するDLLの設定 compiler.ReferencedAssemblies.Add("System.dll");



            CompilerResults compilerResults = provider.CompileAssemblyFromSource(compiler, sauce);

            // ソースファイルのコンパイルを呼び出します。
            if (compilerResults.Errors.Count > 0)
            {
                // コンパイルエラーを表示します。
                foreach (CompilerError ce in compilerResults.Errors)
                {
                    Console.WriteLine (ce.ToString());
                }
            }
            else
            {
                // 正常なコンパイルメッセージを表示します。
                Console.WriteLine("正常に実行されました");
            }
            Console.ReadLine();
        }
    }
}

このようにしてコードを生成できます

注意点

DLLの設定をする必要があります
DLLの設定をされていないと実行できません

最後に

CodeDomを使うとGUIプログラミングツールを簡単に作ることができます。
また、IDEを自作する際にも役に立つと思います。
さらにreplaceを使うことで独自の言語のなんちゃってコンパイラを作ることも可能だと思います

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3