C# 4.0 当使用DLR(动态)和无类型库时,如何为COM对象创建事件处理程序?
我试图避免使用类型库实现COM自动化与C#,而是在运行时使用dynamic关键字解析类型。 这可以正常工作,除非尝试定义事件处理程序 我试着这样定义它:C# 4.0 当使用DLR(动态)和无类型库时,如何为COM对象创建事件处理程序?,c#-4.0,dynamic,com,C# 4.0,Dynamic,Com,我试图避免使用类型库实现COM自动化与C#,而是在运行时使用dynamic关键字解析类型。 这可以正常工作,除非尝试定义事件处理程序 我试着这样定义它: _COMObject.OnStop += new Action(OnStop); 但是,原始COM对象定义了自己的EventHandler类型,没有参数和返回值。 因此,动作当然不是相同的类型,这会导致RuntimeBinderException,声明它无法将动作类型转换为ComObjectCustomEventHandler,尽管它们具有相
_COMObject.OnStop += new Action(OnStop);
但是,原始COM对象定义了自己的EventHandler类型,没有参数和返回值。
因此,动作当然不是相同的类型,这会导致RuntimeBinderException,声明它无法将动作类型转换为ComObjectCustomEventHandler,尽管它们具有相同的签名
我需要一个类似于动态委托的东西,但是我还没有弄清楚如何定义它。我弄清楚了如何使用反射。 我定义了以下帮助器方法:
private void AddEventHandler(string eventName, Delegate method)
{
EventInfo eInfo = _COMObject.GetType().GetEvent(eventName);
MethodInfo evHandler = method.GetMethodInfo();
Delegate del = Delegate.CreateDelegate(eInfo.EventHandlerType, this, evHandler);
eInfo.AddEventHandler(_COMobject, del);
}
现在我可以调用此方法向其添加事件处理程序:
AddEventHandler("OnStop", new Action(OnStop));
如果它没有返回值,则不可能,它必须返回HRESULT以支持后期绑定。顺便说一句,听起来不太可能,程序员很少出错。使用Oleview.exe、File+View-Typelib命令并向我们显示界面。@HansPassant:是的,您是对的,它定义为
HRESULT-OnStop()代码>