DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

プログラムでコンパイルを行う

ICodeCompiler.CompileAssemblyFromSourceメソッドにより、ソースコードが格納されている文字列からアセンブリをコンパイル(インコードコンパイル)することが出来ます。

下に示した例はテキストボックスコントロールRichTextBox1に入力されたコード(VB.NET)をコンパイルし、テキストボックスコントロールTextBox1で指定されたファイル名のファイルに実行ファイルを作成するものです。エラーがあった時はこれを出力します。

VB.NET
コードを隠すコードを選択
'出力するEXEファイル名がTextBox1に入っており、
'ソースコードがRichTextBox1に入力されているものとする
'コードがC#の場合はMicrosoft.CSharp.CSharpCodeProviderを、
'JScriptの場合はMicrosoft.JScript.JScriptCodeProvider使う
Dim vbcp As New Microsoft.VisualBasic.VBCodeProvider()
Dim icc As System.CodeDom.Compiler.ICodeCompiler = vbcp.CreateCompiler()
Dim cps As New System.CodeDom.Compiler.CompilerParameters()
Dim cr As System.CodeDom.Compiler.CompilerResults
'実行ファイルを作成するようにする
cps.GenerateExecutable = True
cps.OutputAssembly = TextBox1.Text
cr = icc.CompileAssemblyFromSource(cps, RichTextBox1.Text)
If cr.Errors.Count > 0 Then
    'エラーがあるときは出力する
    Dim compErr As System.CodeDom.Compiler.CompilerError
    For Each compErr In cr.Errors
        Console.WriteLine("FileName:{0}", compErr.FileName)
        Console.WriteLine("Line:{0}", compErr.Line)
        Console.WriteLine("Column:{0}", compErr.Column)
        Console.WriteLine("ErrorNumber:{0}", compErr.ErrorNumber)
        Console.WriteLine("ErrorText:{0}", compErr.ErrorText)
    Next
    MessageBox.Show("Error")
Else
    MessageBox.Show("Success")
End If
C#
コードを隠すコードを選択
//出力するファイル名がTextBox1に入っており、
//ソースコードがRichTextBox1に入力されているものとする
//コードがC#の場合はMicrosoft.CSharp.CSharpCodeProviderを、
//JScriptの場合はMicrosoft.JScript.JScriptCodeProvider使う
Microsoft.VisualBasic.VBCodeProvider vbcp =
    new Microsoft.VisualBasic.VBCodeProvider();
System.CodeDom.Compiler.ICodeCompiler icc = vbcp.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cps =
    new System.CodeDom.Compiler.CompilerParameters();
System.CodeDom.Compiler.CompilerResults cr;
//実行ファイルを作成するようにする
cps.GenerateExecutable = true;
cps.OutputAssembly = TextBox1.Text;
cr = icc.CompileAssemblyFromSource(cps, RichTextBox1.Text);
if (cr.Errors.Count > 0)
{
    //エラーがあるときは出力する
    foreach (System.CodeDom.Compiler.CompilerError compErr in cr.Errors)
    {
        Console.WriteLine("FileName:{0}", compErr.FileName);
        Console.WriteLine("Line:{0}", compErr.Line);
        Console.WriteLine("Column:{0}", compErr.Column);
        Console.WriteLine("ErrorNumber:{0}", compErr.ErrorNumber);
        Console.WriteLine("ErrorText:{0}", compErr.ErrorText);
    }
    MessageBox.Show("Error");
}
else
{
    MessageBox.Show("Success");
}

//例えば、RichTextBox1に次のように入力してみる
//
//Class Test
//Shared Public Sub Main()
//System.Console.Write("Hello!")
//End Sub
//End Class
補足:CompilerParametersのGenerateInMemoryプロパティをTrueとすることにより、メモリ内に出力を生成することができ、これを使ってスクリプトのように実行することもできます。しかしこの場合は、メモリ内のアセンブリをどのように解放するかという問題があります。詳しくは、「文字列の計算式の計算結果を取得する」をご覧ください。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。