我正在尝试在运行时编译和运行代码。我使用以下代码来实现此目的。但是,当我尝试调用该方法时,只需打开“查找源”文件浏览器对话框,代码就不会运行。谁能在这里帮助我。
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
答案 0 :(得分:0)
您提供的代码不完整。您正在使用此方法编译代码:
CompileResults = CVB.CompileAssemblyFromSource(PM, sCode)
但你实际上从未指明sCode
是什么。如果您要获得一个打开文件浏览器对话框,那么我很确定您的sCode
是它的原因。在计算变量值以打开文件时,必须在某处设置它。
如果您尝试更改用于从文件进行编译的代码段,则将方法从CompileAssemblyFromFile()
更改为CompileAssemblyFromSource()
是不够的。您需要深入研究代码并更改所有相关方法。
答案 1 :(得分:0)
确保您的线程模型是STA。
如果线程模型设置为MTA,则OpenFileDialog和类似对象将无法正常运行。 如果由于其他原因必须使用MTA,那么您可以创建自己的自定义OpenFileDialog类;有点糟透了。