I'm writting an addin and I need to catch events from VCProjectEngine. I know
how to do this without reflection:
....
VCprojectEngineEvents eventsVCEngine= (VCProjectEngineEvents)
dte.Events.GetObject("VCProjectEngineEventsObject");
eventsVCEngine.ItemAdded += new
_dispVCProjectEngineEvents_ItemAddedEventHandler(some_method);
....
And this works fine. However, my addin must work both for VS2005 and VS2008,
so I need to rewrite this code using reflection (which I think is the only
way). And that's what I fail to do. My code is (simplified):
....
Assembly asm = Assembly.LoadFrom(@"C:\Program Files\Microsoft Visual Studio
8\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.VCProjectEngine.dll");
Type eventsDelegateType =
asm.GetType("Microsoft.VisualStudio.VCProjectEngine._dispVCProjectEngineEvents_ItemAddedEventHandler");
Delegate eventsDelegate = Delegate.CreateDelegate(eventsDelegateType, this,
"some_method", true);
Object eventsObject = dte.Events.GetObject("VCProjectEngineEventsObject");
eventsObject.GetType().InvokeMember("ItemAdded", BindingFlags.InvokeMethod,
null, eventsObject, new object[] { eventsDelegate });
....
No matter what I do I always get "Unknown name (DISP_E_UNKNOWNNAME)"
exception in the last row. I tried "add_ItemAdded" (and other rather
desperate names), different BindingFlags, etc - but no luck. Tested in
VS2005, of course.
Maybe I'm doing something totally wrong, but I gave up. Could anyone help?
|