C# 将事件处理程序附加到动态com对象

C# 将事件处理程序附加到动态com对象,c#,events,dynamic,com,com-interop,C#,Events,Dynamic,Com,Com Interop,在我的应用程序中,我需要动态加载com对象。我通过按程序id加载com实现了这一点。它成功了,而且我能够访问动态加载的com的方法和属性。但在事件处理方面出现了一些问题。 请查找以下代码 dynamic ocx = m_axCtrl.GetOcx(); // ocx dynamic loading ocx.method1();//success ocx.Event1+=new EventHandler<object>(EventHandler1); ocx.Event2+=new E

在我的应用程序中,我需要动态加载com对象。我通过按程序id加载com实现了这一点。它成功了,而且我能够访问动态加载的com的方法和属性。但在事件处理方面出现了一些问题。 请查找以下代码

dynamic ocx = m_axCtrl.GetOcx(); // ocx dynamic loading
ocx.method1();//success
ocx.Event1+=new EventHandler<object>(EventHandler1);
ocx.Event2+=new EventHandler<object>(EventHandler2);

public void EventHandler1(object sender , object e) // e is type of class1
{

}

public void EventHandler2(object sender , object e) // e is type of class2
{
}


public class class1
{
      public string arg1;
      public string arg2;
}

public class class2
{
    public string arg1;
    public string arg2;
    public string arg3;
    public string arg4;
    public string arg5;
    public string arg6;
}
dynamic ocx=m_axCtrl.GetOcx();//ocx动态加载
ocx.method1()//成功
Event1+=新的EventHandler(EventHandler1);
Event2+=新的EventHandler(EventHandler2);
public void EventHandler1(对象发送者,对象e)//e是class1的类型
{
}
public void EventHandler2(对象发送者,对象e)//e是类2的类型
{
}
公共班级1
{
公共字符串arg1;
公共字符串arg2;
}
公共课2
{
公共字符串arg1;
公共字符串arg2;
公共字符串arg3;
公共字符串arg4;
公共字符串arg5;
公共字符串arg6;
}

在这里,我的第一个事件将启动,而最后一个事件不会启动。我认为这是由于事件参数的不匹配造成的。创建上述类型的事件处理程序时需要处理哪些事情。请帮助我。

阅读MSDN上的这篇文章:

以下片段与您的问题相关:

COM互操作在您需要的元数据中生成必要的委托 包括在托管客户端中。导入的代理签名 包含接收器事件接口、下划线、事件名称和 单词EventHandler:SinkEventInterface\u EventNameEventHandler

以及:

您可以使用元数据浏览器,如MSIL反汇编程序 (Ildasm.exe),以标识事件委托

请注意,您需要在互操作程序集上使用Ildasm,而不是COM库

这篇文章可能也有帮助: