我正在使用Reflection.Emit命名空間在運行時設計.NET類型。 目前,我即將產生這將調用一個已經存在的方法在所述生成的類的方法:在.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,「公共語言運行時找到了一個無效的程序。」
如果我用例如來自上面的線路來替換我發出呼叫,
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