·When you use reflection to load and run assemblies, you cannot use language features like the C# += operator or the Visual Basic AddHandler statement to hook up events. This MSDN document (http://msdn.microsoft.com/en-us/library/ms228976.aspx) shows how to link an existing method to an event by getting all the necessary types through reflection and how to create a dynamic method using reflection emit and link it to an event.
A sample:
1: // Load an assembly, for example using the Assembly.Load
2: // method. In this case, the executing assembly is loaded, to
3: // keep the demonstration simple.
4: //
5: Assembly assem = Assembly.GetExecutingAssembly();
6:
7: // Get the type that is to be loaded, and create an instance
8: // of it. Activator.CreateInstance has other overloads, if
9: // the type lacks a default constructor. The new instance
10: // is stored as type Object, to maintain the fiction that
11: // nothing is known about the assembly. (Note that you can
12: // get the types in an assembly without knowing their names
13: // in advance.)
14: //
15: Type tExForm = assem.GetType("ExampleForm");
16: Object exFormAsObj = Activator.CreateInstance(tExForm);
17:
18: // Get an EventInfo representing the Click event, and get the
19: // type of delegate that handles the event.
20: //
21: EventInfo evClick = tExForm.GetEvent("Click");
22: Type tDelegate = evClick.EventHandlerType;
23:
24: // If you already have a method with the correct signature,
25: // you can simply get a MethodInfo for it.
26: //
27: MethodInfo miHandler =
28: typeof(Example).GetMethod("LuckyHandler",
29: BindingFlags.NonPublic | BindingFlags.Instance);
30:
31: // Create an instance of the delegate. Using the overloads
32: // of CreateDelegate that take MethodInfo is recommended.
33: //
34: Delegate d = Delegate.CreateDelegate(tDelegate, this, miHandler);
35:
36: // Get the "add" accessor of the event and invoke it late-
37: // bound, passing in the delegate instance. This is equivalent
38: // to using the += operator in C#, or AddHandler in Visual
39: // Basic. The instance on which the "add" accessor is invoked
40: // is the form; the arguments must be passed as an array.
41: //
42: MethodInfo addHandler = evClick.GetAddMethod();
43: Object[] addHandlerArgs = { d };
44: addHandler.Invoke(exFormAsObj, addHandlerArgs);
Some related links:
- Using Reflection to link to event with custom handler (http://social.msdn.microsoft.com/forums/en/netfxbcl/thread/c083a0fd-9338-4f92-b6d4-4109096bfc5f/)
- c# reflection: problem subscribing to event(http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/d7f184f1-0964-412a-8659-6759a0e2db83/)
- Raising an event via reflection(http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/44b0d573-5c53-47b0-8e85-6056cbae95b0)
- Event Handling using Reflection(http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/1ead5b74-3d2f-41e0-b699-1f35e16305ec/)