【发布时间】:2011-11-15 00:09:03
【问题描述】:
我正在使用 Reflection.Emit-Namespace 在运行时设计一个 .NET-Type。 目前,我即将生成一个调用生成类中已经存在的方法的方法:
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, "The Common Language Runtime has found an invalid program."
如果我将上面发出调用的行替换为例如
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方法的签名是什么?
标签: .net vb.net reflection reflection.emit