Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# 对互操作库中的COM对象使用GetEvent_C#_.net_Reflection_Com_Com Interop - Fatal编程技术网

C# 对互操作库中的COM对象使用GetEvent

C# 对互操作库中的COM对象使用GetEvent,c#,.net,reflection,com,com-interop,C#,.net,Reflection,Com,Com Interop,我有一个通过GetType().Invoke()返回的COM对象。我可以看到对象属性/方法/字段,但看不到事件: object obj = invoker.Invoke("MethodReturnsObject"); foreach (EventInfo i in obj.GetType().GetEvents()) { Console.WriteLine(i); // doesn't print anything } 引用中的库的“嵌入互操作类型”设置为True。使用对象浏览器,我可

我有一个通过GetType().Invoke()返回的COM对象。我可以看到对象属性/方法/字段,但看不到事件:

object obj = invoker.Invoke("MethodReturnsObject");
foreach (EventInfo i in obj.GetType().GetEvents()) {
    Console.WriteLine(i); // doesn't print anything
}
引用中的库的“嵌入互操作类型”设置为True。使用对象浏览器,我可以看到对象中确实有我感兴趣的事件,并且它们被声明为公共的。我还可以在互操作库中查看ildasm.exe中的事件

基本上,我试图做的是在获取对象的EventInfo并创建委托后,在运行时向对象添加一个新的事件处理程序:

EventInfo info = obj.GetType().GetEvent("SomeEvent");
Delegate deleg = Delegate.CreateDelegate(info.EventHandlerType, someMethodInfo);
info.AddEventHandler(obj, deleg);

我正在两台不同的电脑上编译和运行,是否会出现互操作dll在另一台电脑上不可见的情况?我的印象是嵌入互操作类型处理这个问题,或者可能有必要使用regasm/gacutil?

COM不支持反射。在某些特定的情况下,如何解决这个问题似乎是一个很长的故事。但这是一个非常短的事件,这是永远不可能的。当您使用嵌入互操作类型功能时,您不应该这样编写代码,因为您已经知道这些类型。所以使用它们。我有一个IDispatchInfo自定义GetType,它为我提供了正确的com对象,而不是System.\u ComObject,因此我可以使用字段/属性等,但不能使用事件。这就是我感到困惑的地方。我很想直接使用类型,但这不是应用程序的目标,我需要将处理程序绑定到事件,而事先不知道它的类型/委托参数。这只是一个想法,但您可以在设计时将COM添加到托管库中(作为包装库)然后动态探索事件的托管互操作,而不是直接查询COM对象?@OrdinaryOrange,这就是我现在要做的,所有事件都必须在一个单独的类中列出,我可以在该类上执行GetEvent()。但是动态获取事件会很好。@platforma,我在这里玩一个COM对象,它也有事件。如果我查看互操作程序集,我会看到事件的单独接口定义。因此,我想知道是否可以动态生成互操作程序集,然后检查托管程序集以获取正确的信息。一旦你有了这些,你就可以进行标准的互操作了。理论上都很好,我不知道如何在运行时生成IA。我想知道VS是如何做到的?COM不支持反射。在某些特定的情况下,如何解决这个问题似乎是一个很长的故事。但这是一个非常短的事件,这是永远不可能的。当您使用嵌入互操作类型功能时,您不应该这样编写代码,因为您已经知道这些类型。所以使用它们。我有一个IDispatchInfo自定义GetType,它为我提供了正确的com对象,而不是System.\u ComObject,因此我可以使用字段/属性等,但不能使用事件。这就是我感到困惑的地方。我很想直接使用类型,但这不是应用程序的目标,我需要将处理程序绑定到事件,而事先不知道它的类型/委托参数。这只是一个想法,但您可以在设计时将COM添加到托管库中(作为包装库)然后动态探索事件的托管互操作,而不是直接查询COM对象?@OrdinaryOrange,这就是我现在要做的,所有事件都必须在一个单独的类中列出,我可以在该类上执行GetEvent()。但是动态获取事件会很好。@platforma,我在这里玩一个COM对象,它也有事件。如果我查看互操作程序集,我会看到事件的单独接口定义。因此,我想知道是否可以动态生成互操作程序集,然后检查托管程序集以获取正确的信息。一旦你有了这些,你就可以进行标准的互操作了。理论上都很好,我不知道如何在运行时生成IA。我想知道VS是怎么做到的?