protected void SetUp () { AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = GetType().FullName; AssemblyBuilder assembly = Thread.GetDomain().DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Run); module = assembly.DefineDynamicModule("module1"); tb = module.DefineType("class1", TypeAttributes.Public); eb = tb.DefineEvent ("event1", EventAttributes.None, typeof (AnEvent)); mb = tb.DefineMethod ("OnAnEvent", MethodAttributes.Public, typeof (void), new Type [] { typeof (AnEvent) }); ILGenerator ilgen = mb.GetILGenerator(); ilgen.Emit (OpCodes.Ret); // These two are required eb.SetAddOnMethod (mb); eb.SetRemoveOnMethod (mb); }
private void BuildRemover(TypeBuilder typeBuilder, EventInfo contractProperty, EventBuilder builder) { var removeMethod = contractProperty.GetRemoveMethod(); if (null != removeMethod) { var removeMethodBuilder = new ProxyMethodImplementationStrategy().BuildMethodProxy(typeBuilder, removeMethod); builder.SetRemoveOnMethod(removeMethodBuilder); } }
public override bool Define () { if (!base.Define ()) return false; if (!TypeManager.IsDelegateType (MemberType)) { Report.Error (66, Location, "`{0}': event must be of a delegate type", GetSignatureForError ()); } if (!CheckBase ()) return false; // // Now define the accessors // var AddBuilder = Add.Define (Parent); if (AddBuilder == null) return false; var RemoveBuilder = remove.Define (Parent); if (RemoveBuilder == null) return false; EventBuilder = Parent.TypeBuilder.DefineEvent (Name, EventAttributes.None, MemberType.GetMetaInfo ()); EventBuilder.SetAddOnMethod (AddBuilder); EventBuilder.SetRemoveOnMethod (RemoveBuilder); spec = new EventSpec (Parent.Definition, this, MemberType, ModFlags, Add.Spec, remove.Spec); Parent.MemberCache.AddMember (this, Name, spec); Parent.MemberCache.AddMember (this, AddBuilder.Name, Add.Spec); Parent.MemberCache.AddMember (this, RemoveBuilder.Name, remove.Spec); return true; }
/// <summary> /// Implementation of the add_PropertyChanged method. The lines bellow but in IL Code /// MethodImplAttribute(MethodImplOptions.Synchronized)] /// public void add_PropertyChanged(PropertyChangedEventHandler handler) /// { /// PropertyChanged = (PropertyChangedEventHandler) Delegate.Combine(PropertyChanged, handler); /// } /// Disassembled il code: /// IL_0000: /* 02 | */ ldarg.0 /// IL_0001: /* 02 | */ ldarg.0 /// IL_0002: /* 7B | (04)000001 */ ldfld class [System/*23000002*/]System.ComponentModel.PropertyChangedEventHandler/*01000004*/ ReflectionEmit.SimplePropertyChangedImplementation/*02000003*/::PropertyChanged /* 04000001 */ /// IL_0007: /* 03 | */ ldarg.1 /// IL_0008: /* 28 | (0A)00003B */ call class [mscorlib/*23000001*/]System.Delegate/*01000032*/ [mscorlib/*23000001*/]System.Delegate/*01000032*/::Combine(class [mscorlib/*23000001*/]System.Delegate/*01000032*/, /// class [mscorlib/*23000001*/]System.Delegate/*01000032*/) /* 0A00003B */ /// IL_000d: /* 74 | (01)000004 */ castclass [System/*23000002*/]System.ComponentModel.PropertyChangedEventHandler/*01000004*/ /// IL_0012: /* 7D | (04)000001 */ stfld class [System/*23000002*/]System.ComponentModel.PropertyChangedEventHandler/*01000004*/ ReflectionEmit.SimplePropertyChangedImplementation/*02000003*/::PropertyChanged /* 04000001 */ /// IL_0017: /* 2A | */ ret /// /// </summary> /// <param name="builder"></param> /// <param name="eventBuilder"></param> /// <param name="eventHandler"></param> /// <param name="operation"></param> private static void addOrRemoveMethod(TypeBuilder builder, EventBuilder eventBuilder, FieldBuilder eventHandler, bool operation) { string methodName; if (operation) { methodName = "add_PropertyChanged"; } else { methodName = "remove_PropertyChanged"; } // code generation MethodBuilder method = builder.DefineMethod( methodName, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(void), new Type[] { typeof(PropertyChangedEventHandler) }); ILGenerator mthdIL = method.GetILGenerator(); mthdIL.Emit(OpCodes.Ldarg_0); mthdIL.Emit(OpCodes.Ldarg_0); mthdIL.Emit(OpCodes.Ldfld, eventHandler); mthdIL.Emit(OpCodes.Ldarg_1); if (operation) { mthdIL.Emit(OpCodes.Call, typeof(System.Delegate).GetMethod("Combine", new Type[] { typeof(Delegate), typeof(Delegate) })); } else { mthdIL.Emit(OpCodes.Call, typeof(System.Delegate).GetMethod("Remove", new Type[] { typeof(Delegate), typeof(Delegate) })); } mthdIL.Emit(OpCodes.Castclass, typeof(PropertyChangedEventHandler)); mthdIL.Emit(OpCodes.Stfld, eventHandler); mthdIL.Emit(OpCodes.Ret); // attach the methods to the event if (operation) { eventBuilder.SetAddOnMethod(method); } else { eventBuilder.SetRemoveOnMethod(method); } }
public void TestCreation () { eb = tb.DefineEvent ("event2", EventAttributes.SpecialName, typeof (AnEvent)); eb.SetRaiseMethod (mb); eb.SetAddOnMethod (mb); eb.SetRemoveOnMethod (mb); eb.AddOtherMethod (mb); eb.AddOtherMethod (mb); Type t = tb.CreateType (); MethodInfo mi = t.GetMethod ("OnAnEvent"); EventInfo[] events = t.GetEvents (); AssertEquals (2, events.Length); { EventInfo ev = t.GetEvent ("event1"); AssertEquals ("event1", ev.Name); AssertEquals (EventAttributes.None, ev.Attributes); AssertEquals (t, ev.DeclaringType); AssertEquals (typeof (AnEvent), ev.EventHandlerType); AssertEquals (true, ev.IsMulticast); AssertEquals (false, ev.IsSpecialName); AssertEquals (mi, ev.GetAddMethod ()); AssertEquals (null, ev.GetRaiseMethod ()); AssertEquals (mi, ev.GetRemoveMethod ()); } { EventInfo ev = t.GetEvent ("event2"); AssertEquals ("event2", ev.Name); AssertEquals (EventAttributes.SpecialName, ev.Attributes); AssertEquals (t, ev.DeclaringType); AssertEquals (typeof (AnEvent), ev.EventHandlerType); AssertEquals (true, ev.IsMulticast); AssertEquals (true, ev.IsSpecialName); AssertEquals (mi, ev.GetAddMethod ()); AssertEquals (mi, ev.GetRaiseMethod ()); AssertEquals (mi, ev.GetRemoveMethod ()); } }
public override bool Define() { if (!base.Define ()) return false; if (!TypeManager.IsDelegateType (MemberType)) { Report.Error (66, Location, "`{0}': event must be of a delegate type", GetSignatureForError ()); } parameters = ParametersCompiled.CreateFullyResolved ( new Parameter (null, "value", Parameter.Modifier.NONE, null, Location), MemberType); if (!CheckBase ()) return false; // // Now define the accessors // AddBuilder = Add.Define (Parent); if (AddBuilder == null) return false; RemoveBuilder = Remove.Define (Parent); if (RemoveBuilder == null) return false; EventBuilder = Parent.TypeBuilder.DefineEvent (Name, EventAttributes.None, MemberType.GetMetaInfo ()); EventBuilder.SetAddOnMethod (AddBuilder); EventBuilder.SetRemoveOnMethod (RemoveBuilder); var spec = new EventSpec (Parent.Definition, this, MemberType, ModFlags, Add.Spec, Remove.Spec); Parent.MemberCache.AddMember (this, Name, spec); Parent.MemberCache.AddMember (this, AddBuilder.Name, Add.Spec); Parent.MemberCache.AddMember (this, RemoveBuilder.Name, Remove.Spec); return true; }