我有一个文本文件,我正在使用 VBCodeProvider 类将其编译到程序集中
该文件如下所示:
Imports System
Imports System.Data
Imports System.Windows.Forms
Class Script
Public Sub AfterClockIn(ByVal clockNo As Integer, ByRef comment As String)
If clockNo = 1234 Then
comment = "Not allowed"
MessageBox.Show(comment)
End If
End Sub
End Class
下面是编译代码:
Private _scriptClass As Object
Private _scriptClassType As Type
Dim codeProvider As New Microsoft.VisualBasic.VBCodeProvider()
Dim optParams As New CompilerParameters
optParams.CompilerOptions = "/t:library"
optParams.GenerateInMemory = True
Dim results As CompilerResults = codeProvider.CompileAssemblyFromSource(optParams, code.ToString)
Dim assy As System.Reflection.Assembly = results.CompiledAssembly
_scriptClass = assy.CreateInstance("Script")
_scriptClassType = _scriptClass.GetType
我想做的是修改方法内部注释 String 的值,以便在我从代码调用它后我可以检查该值:
Dim comment As String = "Foo"
Dim method As MethodInfo = _scriptClassType.GetMethod("AfterClockIn")
method.Invoke(_scriptClass, New Object() {1234, comment})
Debug.WriteLine(comment)
但是注释始终"Foo"
(消息框显示"Not Allowed"
),因此似乎 ByRef 修饰符不起作用
如果我在代码中使用相同的方法comment
则会正确修改。
但是注释始终为"Foo"(消息框显示"不允许"),因此似乎 ByRef 修饰符不起作用
是的,但你用错了,期望值不正确:)
创建参数数组时,comment
的值将复制到数组中。方法完成后,您将无法再访问该数组,因此看不到它已更改。数组中的更改不会影响comment
的值,但证明了ByRef
的性质。所以你想要的是:
Dim arguments As Object() = New Object() { 1234, comment }
method.Invoke(_scriptClass, arguments)
Debug.WriteLine(arguments(1))