2

デリゲートを動的に作成しようとしていますが、うまくいきません:S

実装

  1. ソース コードをコンパイルする CodeDomProvider オブジェクトを作成します。
  2. コンパイルされたアセンブリ (結果) がメモリに格納されます。(私のHDDではありません)
  3. 結果から型を取得
  4. Delegate.CreateDelegate メソッドでデリゲートを作成します。

CodeDomProvider によってコンパイルされるソース コード

Imports System

Public Class CTest

    Public Delegate Function HelloB() As Int32

End Class

ソースコード

Dim VBCompiler As CodeDom.Compiler.CodeDomProvider = CodeDom.Compiler.CodeDomProvider.CreateProvider("VB"),
    CParam As New CodeDom.Compiler.CompilerParameters,
    CResult As CodeDom.Compiler.CompilerResults

CParam.GenerateExecutable = False
CParam.GenerateInMemory = True
CParam.IncludeDebugInformation = False
CParam.ReferencedAssemblies.Add("System.dll")

CResult = VBCompiler.CompileAssemblyFromSource(CParam, TextBox1.Text)

Dim CompiledAssembly As System.Reflection.Assembly = CResult.CompiledAssembly
Dim CDelegate As Type = CompiledAssembly.GetType("CTest+HelloB")
If Not IsNothing(CDelegate ) Then

    Dim miHelloB As System.Reflection.MethodInfo = CDelegate .GetMethod("Invoke")
    Dim dgHelloB As [Delegate] = [Delegate].CreateDelegate(CDelegate, miHelloB)
    dgHelloB.DynamicInvoke()

End If

このコードをコンパイルしてデバッグすると、この行で例外が発生しました。

Dim dgHelloB As [Delegate] = [Delegate].CreateDelegate(CDelegate, miHelloB)

例外メッセージ: ターゲット メソッドへのバインド中にエラーが発生しました。このコードを修正するにはどうすればよいですか?? 誰でも助けてください。

4

1 に答える 1

0

インスタンスメソッドを持っていると思います。Invokeこの場合、CreateDelegate のオーバーロードに従う必要があります。

public static Delegate CreateDelegate(
    Type type,
    Object target/*your class instance CTest */,
    string method
)
于 2013-10-10T13:34:10.893 に答える