Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '例1 Dim source As String = IO.File.ReadAllText("C:\vb\VBCode.vbc") EVal(source) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click '例2 EVal("MsgBox(""Hello, Visual Basic!"")") End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click '例3 Dim vb As New System.Text.StringBuilder vb.AppendLine("Dim x As Integer") vb.AppendLine("x = 5 ^ 5 mod 3") vb.AppendLine("MsgBox(x)") EVal(vb.ToString) End Sub ''' <summary> ''' 部分的なVisual Basicのソースコードをコンパイルし実行します。 ''' sourceではプロシージャやクラスを作成する内容を記述することはできません。 ''' 完全なVisual Basicのソースコードをコンパイルし、実行する場合はEvalVBSourceを使用してください。 ''' </summary> Public Sub EVal(ByVal source As String) 'コンパイル実行 Dim template As New System.Text.StringBuilder template.AppendLine("Public Class Start") template.AppendLine("Shared Sub Main()") template.AppendLine(source) template.AppendLine("End Sub") template.AppendLine("End Class") EValVBSource(template.ToString) End Sub ''' <summary> ''' 完全なVisual Basicのソースコードをコンパイルし実行します。 ''' 実行はソースコードに含まれる有効なSub Mainから開始するため、ソースコードには必ず有効なSub Mainを含んでください。 ''' 単純なコードを実行したいだけの場合はEvalを使用するほうが手軽です。 ''' </summary> Public Sub EValVBSource(ByVal fullSource As String) 'この名前でコンパイルしたファイルを保存する Dim dllFileName As String = "C:\vb\test.exe" 'コンパイル実行 Dim result = CompileString(fullSource, dllFileName) 'コンパイルエラーがあれば表示する。 If result.Errors.Count > 0 Then Dim errorMessage As New System.Text.StringBuilder For Each er As CodeDom.Compiler.CompilerError In result.Errors errorMessage.AppendLine(er.Line & "," & er.ErrorText) Next Throw New InvalidOperationException(errorMessage.ToString) End If '実行 Process.Start(dllFileName) End Sub ''' <summary> ''' Visual Basicのソースコードをコンパイルしてdllファイルを作成します。 ''' 対象のソースコードはVisual StudioやVisual Basic Expressを使用して作成するソースコードと基本的には同じですが、 ''' 前提条件となっている設定がすべて空の状態になっているため、普段は意識していないような設定が必要になります。 ''' たとえば、System.Collection名前空間のクラスは名前空間を省略して使用することはできません。 ''' ただし、これらの設定をコンパイラに伝えることで通常と同じような記述ができるようにすることはできます。 ''' そのような設定がたくさんあるためここでは最低限のものだけを設定しています。 ''' </summary> Public Function CompileString(ByVal source As String, ByVal resultFile As String) As CodeDom.Compiler.CompilerResults Dim provider As CodeDom.Compiler.CodeDomProvider = CodeDom.Compiler.CodeDomProvider.CreateProvider("VisualBasic") Dim referenceAssemblies As String() = {"System.dll"} Dim cp As New CodeDom.Compiler.CompilerParameters(referenceAssemblies, resultFile, False) cp.CompilerOptions = "/imports:Microsoft.VisualBasic /target:winexe" cp.GenerateExecutable = True Dim cr As CodeDom.Compiler.CompilerResults = provider.CompileAssemblyFromSource(cp, source) Return cr End Function End Class