C# コンパイラを使用してプログラムによってコードをコンパイルする方法


Visual Basic .NET については、次の資料を参照してください。304654

概要


.NET Framework では、プログラムによって C# 言語コンパイラにアクセスするためのクラスを公開しています。 これは、独自のコード コンパイル ユーティリティを作成する場合にも使用できます。 この資料には、テキスト ソースからコードをコンパイルするためのサンプル コードが含まれています。 このアプリケーションでは、実行可能ファイルのビルドだけを行うか、または実行可能ファイルをビルドして実行することができます。 コンパイル中に発生したエラーは、フォーム上に表示されます。

詳細情報


手順 1: 必要条件

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

手順 2: プログラムによってコードをコンパイルする方法

.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 への呼び出し時にコンパイルされます。 このメソッドは、パラメータ オブジェクトとソース コード (1 つの文字列) を受け取ります。 コードのコンパイル後には、コンパイル エラーがないかどうかをチェックできます。 これには、CompileAssemblyFromSource からの戻り値、つまり CompilerResults オブジェクトを使用します。 このオブジェクトには、コンパイル中に発生したエラーを含むエラー コレクションが含まれています。

   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;
}
}

他にも、ファイルからのコンパイルなどのコンパイル オプションがあります。 また、複数のファイルやソースを同時にコンパイルするバッチ コンパイルも可能です。 これらのクラスに関する追加情報は、MSDN オンライン ライブラリで参照できます。

手順 3: ステップバイステップの手順例

  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);
    }
    }
    Add the beginning of the file, add these using statements:
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    注: Visual Studio 2005 または Visual Studio 2008 を使用している場合は、CSharpCodeProvider クラスは推奨されていません。 次の button1_Click 実装が示すように、代わりに CodeDomProvider クラスを使用できます。
    private void button1_Click(object sender, System.EventArgs e)
    {
    CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
    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 = codeProvider.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);
    }
    }
    Add the beginning of the file, add these using statements:
    using System.CodeDom.Compiler;
    using System.Diagnostics;
  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. プロジェクトを実行します。 Form 1 が読み込まれたら、[Build] ボタンをクリックします。 いくつかのコンパイル エラーが表示されます。
  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" という実行可能ファイルが作成されます。

    注: テキスト ボックス内のコードを変更して、さまざまなコンパイル エラーを表示させることができます。 たとえば、セミコロンを 1 つ削除して、コードを再ビルドします。
  13. 最後に、コンソール ウィンドウにもう 1 行のテキストが出力されるように、テキスト ボックス内のコードを修正します。 [Run] をクリックして出力を確認します。