C# コンパイラを使用してプログラムでコードをコンパイルする

この記事では、C# コンパイラを使用してテキスト ソースからコードをコンパイルする方法について説明します。

元の製品バージョン:Visual Studio、.NET Framework
元の KB 番号: 304655

概要

Microsoft .NET Frameworkでは、C# 言語コンパイラにプログラムでアクセスできるクラスが公開されています。 これは、独自のコード コンパイル ユーティリティを記述する場合に便利です。 この記事では、テキスト ソースからコードをコンパイルできるサンプル コードについて説明します。 アプリケーションを使用すると、実行可能ファイルをビルドするか、実行可能ファイルをビルドして実行できます。 コンパイル プロセス中に発生したエラーは、フォームに表示されます。

要件

  • Visual Studio
  • Visual C# 言語コンパイラ

C# コンパイラを使用してコードをコンパイルする

.NET Frameworkは、コンパイラ実行インターフェイスをICodeCompiler提供します。 クラスはこの CSharpCodeProvider インターフェイスを実装し、C# コード ジェネレーターとコード コンパイラのインスタンスへのアクセスを提供します。 次のサンプル コードでは、 の CSharpCodeProvider インスタンスを作成し、それを使用してインターフェイスへの参照を ICodeCompiler 取得します。

CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();

インターフェイスへの ICodeCompiler 参照を取得したら、それを使用してソース コードをコンパイルできます。 クラスを使用して、コンパイラにパラメーターを CompilerParameters 渡します。 次に例を示します:

System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString);

上記のコードでは、 オブジェクトを CompilerParameters 使用して、実行可能ファイル (DLL ではなく) を生成し、結果のアセンブリをディスクに出力することをコンパイラに伝えます。 の CompileAssemblyFromSource 呼び出しは、アセンブリがコンパイルされる場所です。 このメソッドは、parameters オブジェクトとソース コード (文字列) を受け取ります。 コードをコンパイルした後、チェックしてコンパイル エラーがあるかどうかを確認できます。 オブジェクトである から CompileAssemblyFromSource戻り値を CompilerResults 使用します。 このオブジェクトには、コンパイル中に発生したエラーを含む errors コレクションが含まれています。

if (results.Errors.Count > 0)
{
    foreach(CompilerError CompErr in results.Errors)
    {
        textBox2.Text = textBox2.Text +
            "Line number " + CompErr.Line +
            ", Error Number: " + CompErr.ErrorNumber +
            ", '" + CompErr.ErrorText + ";" +
            Environment.NewLine + Environment.NewLine;
    }
}

ファイルからのコンパイルなど、コンパイルには他にもオプションがあります。 バッチ コンパイルも可能です。つまり、複数のファイルまたはソースを同時にコンパイルできます。

手順の例

  1. 新しい Visual C# .NET Windows アプリケーションを作成します。 Form1 は既定で作成されます。

  2. Button コントロールを Form1 に追加し、 その Text プロパティを Build に変更します。

  3. 別の Button コントロールを Form1 に追加し、 その Text プロパティを [実行] に変更します。

  4. 2 つの TextBox コントロールを Form1 に追加し、両方のコントロールの 複数行 プロパティを True に設定し、これらのコントロールのサイズを設定して、複数行のテキストを各コントロールに貼り付けることができます。

  5. コード エディターで、 Form1.cs ソース ファイルを開きます。

  6. クラスに Form1 、次のボタン クリック ハンドラーを貼り付けます。

    private void button1_Click(object sender, System.EventArgs e)
    {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        ICodeCompiler icc = codeProvider.CreateCompiler();
        string Output = "Out.exe";
        Button ButtonObject = (Button)sender;
    
        textBox2.Text = "";
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        //Make sure we generate an EXE, not a DLL
        parameters.GenerateExecutable = true;
        parameters.OutputAssembly = Output;
        CompilerResults results = icc.CompileAssemblyFromSource(parameters, textBox1.Text);
    
        if (results.Errors.Count > 0)
        {
            textBox2.ForeColor = Color.Red;
            foreach (CompilerError CompErr in results.Errors)
            {
                textBox2.Text = textBox2.Text +
                            "Line number " + CompErr.Line +
                            ", Error Number: " + CompErr.ErrorNumber +
                            ", '" + CompErr.ErrorText + ";" +
                            Environment.NewLine + Environment.NewLine;
            }
        }
        else
        {
            //Successful Compile
            textBox2.ForeColor = Color.Blue;
            textBox2.Text = "Success!";
            //If we clicked run then launch our EXE
            if (ButtonObject.Text == "Run") Process.Start(Output);
        }
    }
    

    ファイルの先頭に、次 using のステートメントを追加します。

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. Form1.csで、コンストラクターをForm1見つけます。

  8. コンストラクターで を InitializeComponent 呼び出した Form1 後、次のコードを追加して、ボタン クリック ハンドラーを Form1 に追加した両方のボタンに結び付けます。

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. プロジェクトを実行します。 Form1 が読み込まれたら、[ビルド] ボタンをクリックします。

    注:

    コンパイラ エラーが発生します。

  10. 次に、次のテキストをテキスト ボックスにコピーし、既存のテキストを置き換えます。

    using System;
    namespace HelloWorld
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class HelloWorldClass
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.ReadLine();
            }
        }
    }
    
  11. もう一度 [ ビルド ] をクリックします。 コンパイルは成功する必要があります。

  12. [ 実行] をクリックすると、コードがコンパイルされ、結果の実行可能ファイルが実行されます。 コンパイルにより 、Out.exeという実行可能ファイルが作成されます。これは、実行しているアプリケーションと同じフォルダーに保存されます。

    注:

    テキスト ボックス内のコードを変更して、さまざまなコンパイラ エラーを確認できます。 たとえば、セミコロンの 1 つを削除し、コードを再構築します。

  13. 最後に、テキスト ボックスのコードを変更して、コンソール ウィンドウに別の行のテキストを出力します。 [ 実行 ] をクリックして出力を表示します。

関連情報