Torna al Thread
Dim iEvento As EventInfo, D As [Delegate], Eventi() As Object, i As Integer
Dim HandlerType As Type, InvokeMethod As MethodInfo, Parms As ParameterInfo()
Dim ParmTypes() As Type, AName As New AssemblyName()
Dim AB As AssemblyBuilder, MB As ModuleBuilder, TB As TypeBuilder
Dim Handler As MethodBuilder, IL As ILGenerator
Dim Finished As Type, EventHandler As MethodInfo
Dim Metodo As MethodInfo
Try
iEvento = MyClasse.GetType.GetEvent(NEvento)
HandlerType = iEvento.EventHandlerType
InvokeMethod = HandlerType.GetMethod("Invoke")
Parms = InvokeMethod.GetParameters()
'Elenco i parametri che ritorna l'evento
ReDim ParmTypes(Parms.Length - 1)
For i = 0 To Parms.Length - 1
ParmTypes(i) = Parms(i).ParameterType
Next i
AName.Name = "DynamicTypes"
AB = AppDomain.CurrentDomain.DefineDynamicAssembly(AName, AssemblyBuilderAccess.Run)
MB = AB.DefineDynamicModule(AName.Name)
TB = MB.DefineType("Handler", TypeAttributes.Class Or TypeAttributes.Public)
Handler = TB.DefineMethod("DynamicHandler", MethodAttributes.Public Or MethodAttributes.Static, InvokeMethod.ReturnType, ParmTypes)
ReDim Eventi(1) '1° Nome Evento, 2° HandlerType
Eventi(0) = NEvento
Eventi(1) = HandlerType
Metodo = Assembly.GetExecutingAssembly.GetType.GetMethod("ChiamaEvento")
IL = Handler.GetILGenerator()
IL.EmitCall(OpCodes.Call, Metodo, Eventi)
IL.Emit(OpCodes.Ret)
Finished = TB.CreateType()
EventHandler = Finished.GetMethod("DynamicHandler")
D = [Delegate].CreateDelegate(HandlerType, EventHandler)
iEvento.AddEventHandler(MyClasse, D)
Catch ex As TargetException
Throw New Exception("Evento non statico")
Exit Sub
Catch ex As NullReferenceException
Throw New Exception("Evento inesistente")
Exit Sub
Catch ex As Exception
Console.Beep()
'Throw New Exception("Tipo dati non valido")
End Try