ICodeCompiler.CompileAssemblyFromSourceメソッドにより、ソースコードが格納されている文字列からアセンブリをコンパイル(インコードコンパイル)することが出来ます。
下に示した例はテキストボックスコントロールRichTextBox1に入力されたコード(VB.NET)をコンパイルし、テキストボックスコントロールTextBox1で指定されたファイル名のファイルに実行ファイルを作成するものです。エラーがあった時はこれを出力します。
'出力する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
//出力するファイル名が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とすることにより、メモリ内に出力を生成することができ、これを使ってスクリプトのように実行することもできます。しかしこの場合は、メモリ内のアセンブリをどのように解放するかという問題があります。詳しくは、「文字列の計算式の計算結果を取得する」をご覧ください。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。