コンパイラを使用してプログラムでコード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);

上記のコードでは、オブジェクトを使用して、実行可能ファイルを (DLL ではなく) 生成し、結果のアセンブリをディスクに出力する必要があるというメッセージをコンパイラ CompilerParameters に伝えます。 呼び出し 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. .NET ファイル アプリケーションVisual C#作成Windowsします。 Form1 は 既定で作成されます。

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

  3. Form1 に別の Button コントロールを追加 し、その 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 が読み込 まれると、[ビルド]ボタンをクリック します。

    注意

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

  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という名前の実行可能ファイルが作成され、実行しているアプリケーションと同じフォルダーに保存されます。

    注意

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

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

関連情報