Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 当使用DLR(动态)和无类型库时,如何为COM对象创建事件处理程序?_C# 4.0_Dynamic_Com - Fatal编程技术网

C# 4.0 当使用DLR(动态)和无类型库时,如何为COM对象创建事件处理程序?

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,尽管它们具有相

我试图避免使用类型库实现COM自动化与C#,而是在运行时使用dynamic关键字解析类型。 这可以正常工作,除非尝试定义事件处理程序

我试着这样定义它:

_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()