如何使用Method.Invoke使ByRef Arguments在动态创建的程序集中工作

时间:2014-02-11 11:57:44

标签: .net vb.net reflection scripting vbcodeprovider

我有一个文本文件,我正在编译成程序集使用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中使用相同的方法,则会被正确修改。

1 个答案:

答案 0 :(得分:2)

  

但注释总是“Foo”(消息框显示“Not Allowed”),因此看起来ByRef修饰符不起作用

确实如此,但是您的使用不正确,预期不正确:)

创建参数数组时,您comment的值复制到数组中。方法完成后,您将无法再访问该数组,因此您无法看到它已更改。数组中的更改不会影响comment的值,但会演示ByRef性质。所以你想要的是:

Dim arguments As Object() = New Object() { 1234, comment }
method.Invoke(_scriptClass, arguments)
Debug.WriteLine(arguments(1))