次の方法で共有


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 オブジェクトとソース コード (文字列) を受け取ります。 コードをコンパイルした後、コンパイル エラーが発生したかどうかを確認できます。 CompilerResults オブジェクトであるCompileAssemblyFromSourceからの戻り値を使用します。 このオブジェクトには、コンパイル中に発生したエラーを含むエラー コレクションが含まれています。

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 プロパティを Run に変更します。

  4. 2 つの TextBox コントロールを Form1 に追加し、両方のコントロールの Multiline プロパティを 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. Form1 コンストラクターでInitializeComponentを呼び出した後、次のコードを追加して、Form1 に追加した両方のボタンにボタン クリック ハンドラーを接続します。

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

    Note

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

  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. もう一度 Build をクリックします。 コンパイルは成功するはずです。

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

    Note

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

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

関連情報