Я разрабатываю .NET-тип во время выполнения, используя пространство имен Reflection.Emit-Name.В настоящее время я собираюсь сгенерировать метод, который вызывает уже существующий метод в генерирующем классе:
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)
, он работает нормально.
Я полагаю, что возникает проблема, потому что выполняющиеся типы сборок и их элементы не доступны, но так ли это, и что я могу изменить, чтобы запустить его?
Спасибо
Момо