在运行时编译和运行代码

时间:2012-11-29 13:56:59

标签: vb.net reflection

我正在尝试在运行时编译和运行代码。我使用以下代码来实现此目的。但是,当我尝试调用该方法时,只需打开“查找源”文件浏览器对话框,代码就不会运行。谁能在这里帮助我。

Dim VBP As New VBCodeProvider
Dim CVB As System.CodeDom.Compiler.ICodeCompiler

CVB = VBP.CreateCompiler
Dim PM As New System.CodeDom.Compiler.CompilerParameters

PM.GenerateInMemory = True
PM.GenerateExecutable = True
PM.OutputAssembly = "RunCode.dll"
PM.MainClass = "MainClass"
PM.IncludeDebugInformation = True

Dim ASM As System.Reflection.Assembly
For Each ASM In AppDomain.CurrentDomain.GetAssemblies
    PM.ReferencedAssemblies.Add(ASM.Location)
Next
Dim CompileResults As System.CodeDom.Compiler.CompilerResults

CompileResults = CVB.CompileAssemblyFromSource(PM, sCode)

Dim CompileErrors As System.CodeDom.Compiler.CompilerError

For Each CompileErrors In CompileResults.Errors
    RTMainScript.AppendText(vbCrLf & CompileErrors.ErrorNumber & ": " & CompileErrors.ErrorText & ", " & CompileErrors.Line)
Next

Dim objRun As New Object
Dim vArgs() As Object

objRun = CompileResults.CompiledAssembly.CreateInstance("RunCode.MainClass", False, BindingFlags.CreateInstance, Nothing, vArgs, Nothing, Nothing)
If Not objRun Is Nothing Then
    Dim oMethodInfo As MethodInfo = objRun.GetType().GetMethod("Main")
    Dim oRetObj As Object = oMethodInfo.Invoke(objRun, BindingFlags.Static Or BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic, Nothing, Nothing, Nothing) 'Find source dialog appears here
Else
    MsgBox("Compile Error")
End If

2 个答案:

答案 0 :(得分:0)

您提供的代码不完整。您正在使用此方法编译代码:

CompileResults = CVB.CompileAssemblyFromSource(PM, sCode)

但你实际上从未指明sCode是什么。如果您要获得一个打开文件浏览器对话框,那么我很确定您的sCode是它的原因。在计算变量值以打开文件时,必须在某处设置它。

如果您尝试更改用于从文件进行编译的代码段,则将方法从CompileAssemblyFromFile()更改为CompileAssemblyFromSource()是不够的。您需要深入研究代码并更改所有相关方法。

答案 1 :(得分:0)

确保您的线程模型是STA。

如果线程模型设置为MTA,则

OpenFileDialog和类似对象将无法正常运行。 如果由于其他原因必须使用MTA,那么您可以创建自己的自定义OpenFileDialog类;有点糟透了。