Reflection.Emit-Namespaceを使用して実行時に.NET-Typeを設計しています。.NETでReflection.Emitを使用してハードコーディングされた既存のメソッドを呼び出す
Dim AssemblyBuilder As AssemblyBuilder = Nothing
Dim ModuleBuilder As ModuleBuilder = Nothing
Dim TypeBuilder As TypeBuilder = Nothing
Dim MethodBuilder As MethodBuilder
Dim ReturnType As Type = Nothing
AssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(New AssemblyName("DynamicAssembly"), AssemblyBuilderAccess.RunAndSave)
ModuleBuilder = AssemblyBuilder.DefineDynamicModule("DynamicAsssembly", "DynamicAssembly.dll")
TypeBuilder = ModuleBuilder.DefineType("DynamicType")
MethodBuilder = TypeBuilder.DefineMethod("Do", MethodAttributes.Public, Nothing, Nothing)
上記作品: 現在、私は、生成クラスに既存のメソッドを呼び出すメソッドを生成しようと思います。
MethodBuilder.GetILGenerator.EmitCall(OpCodes.Call, Me.GetType.GetMethod("DisplayString"), Nothing)
MethodBuilder.GetILGenerator.Emit(OpCodes.Ret)
ReturnType = TypeBuilder.CreateType()
Activator.CreateInstance(ReturnType)
これは、私は、一般的にやりたいたい:実行クラス自体に位置しているメソッドを呼び出します。しかし、以下を呼び出すと、例外がスローされます。
ReturnType.GetMethod("Do").Invoke(Activator.CreateInstance(ReturnType), Nothing)
内部例外は(何かのような)です:InvalidProgramException、 "Common Language Runtimeが無効なプログラムを見つけました。"
私が電話を発する上記の行を、たとえば、
MethodBuilder.GetILGenerator.Emit(OpCodes.Ldstr, "test")
MethodBuilder.GetILGenerator.EmitCall(OpCodes.Call, GetType(System.Windows.Forms.MessageBox).GetMethod("Show", {GetType(String)}), {GetType(String)})
MethodBuilder.GetILGenerator.Emit(OpCodes.Pop)
正常に動作します。
実行中のアセンブリの種類とそのメンバにアクセスできないため、実際に問題が発生している可能性がありますが、それを実行するために何を変更する必要がありますか?
モモ
'DisplayString'メソッドのシグニチャは何ですか? – svick