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

あなたが提供したコードは不完全です。このメソッドを使用してコードをコンパイルしています。

CompileResults = CVB.CompileAssemblyFromSource(PM, sCode)

しかし、あなたは実際に何が何であるかを決して指定しませんでしたsCodesCodeファイルを開くブラウザのダイアログが表示される場合は、あなたが原因であると確信しています。ファイルを開くための変数値を計算しているときに、どこかに設定されている必要があります。

ファイルからのコンパイルに使用されたコードの一部を変更しようとしている場合、メソッドを からCompileAssemblyFromFile()に変更するCompileAssemblyFromSource()だけでは十分ではありません。コードをさらに掘り下げて、関連するすべてのメソッドを変更する必要があります。

于 2012-11-29T19:19:34.167 に答える
0

スレッド モデルが STA であることを確認します。

スレッド モデルが MTA に設定されている場合、OpenFileDialog および同様のオブジェクトは正しく動作しません。他の理由で MTA を使用する必要がある場合は、独自のカスタム OpenFileDialog クラスを作成できます。一種の吸う。

于 2013-02-15T03:13:58.087 に答える