我正在尝试使用VBCodeProvider
类进行快速代码编译。我希望能够做的是在代码中修改程序集中的公共变量。
我的申请表中有Public TestString As String = ""
。
这是我用来编译的代码:
Dim codeProvider As New VBCodeProvider()
Dim optParams As New CompilerParameters
optParams.ReferencedAssemblies.Add("MyAssembly.exe")
optParams.ReferencedAssemblies.Add("system.windows.forms.dll")
optParams.CompilerOptions = "/t:library"
optParams.GenerateInMemory = True
Dim results As CompilerResults = codeProvider.CompileAssemblyFromSource(optParams, RichTextBox1.Text)
If results.Errors.Count > 0 Then
Dim sb As New StringBuilder("Compilation Failed with the following error(s)" + CR_LF + CR_LF)
For Each CompErr As CompilerError In results.Errors
sb.Append(String.Format("Line {0} - {1} ({2}){3}", CompErr.Line, CompErr.ErrorText, CompErr.ErrorNumber, CR_LF))
Next
MessageBox.Show(sb.ToString, "Compile Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
Dim assy As System.Reflection.Assembly = results.CompiledAssembly
Dim exeinstance As Object = assy.CreateInstance("Script")
Dim typ As Type = exeinstance.GetType
Dim method As MethodInfo = typ.GetMethod("Main")
method.Invoke(exeinstance, Nothing)
End If
这是我文本框中的代码:
Imports System
Imports MyAssembly
Class Script
Sub Main()
TestString="foo"' <-- This line fails compilation
End Sub
End Class
我得到的错误是未声明'TestString'。由于其保护级别,它可能无法访问。 (BC30451)
答案 0 :(得分:3)
就像普通的VB.NET一样,除了添加引用之外,还必须Imports
相关的命名空间,或者完全指定它。 (你已经编辑了这个问题,现在包括这个。)
将代码插入VS2008中的新控制台项目(因为这是我打开的)并调整我的程序集名称后,我看到的与您相同。
我通过将Public
添加到默认Module Module1
来修复它。