3

我正在尝试在运行时编译和运行代码。我正在使用下面的代码来实现这一点。但是,当我尝试调用该方法时,只会打开一个“查找源”文件浏览器对话框,并且代码不会运行。任何人都可以在这里帮助我。

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
4

2 回答 2

0

确保您的线程模型是 STA。

如果线程模型设置为 MTA,OpenFileDialog 和类似对象将无法正确运行。如果您出于其他原因必须使用 MTA,那么您可以创建自己的自定义 OpenFileDialog 类;有点糟糕。

于 2013-02-15T03:13:58.087 回答
0

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

CompileResults = CVB.CompileAssemblyFromSource(PM, sCode)

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

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

于 2012-11-29T19:19:34.167 回答