0

我有一个非托管 C++ COM 服务器,它设置为触发事件,我正在尝试从我的 C# 应用程序处理这些事件。

但是,设置处理程序时出现 InvalidCastException

myCOMObj.MyCOMEvent += new MyCOMSource_MyCOMEventHandler(handler);

堆栈跟踪显示:

指定的演员表无效。在 System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(Object pUnkSink, Int32& dwCookie) 在 MyCOMSource_EventProvider.add_MyCOMEvent(MyCOMSource_MyCOMEventHandler) 在 MyCOMSource_Event.add_MyCOMEvent(MyCOMSource_MyCOMEventHandler)

我试过像这样设置自己的 IConnectionPoint

IConnectionPointContainer connectionPointContainer = (IConnectionPointContainer)myCOMObj;
Guid sourceGuid = typeof(MyCOMSource).GUID;
IConnectionPoint connectionPoint;
connectionPointContainer.FindConnectionPoint(ref sourceGuid, out connectionPoint);
int cookie;
connectionPoint.Advise(myEventNotifier, out cookie);

哪里myEventNotifier是这样定义的类对象:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class EventNotifier : MyCOMSource
...

connectionPoint.Advise但是我在堆栈跟踪中得到了相同的 InvalidCastException

指定的演员表无效。在 System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(对象 pUnkSink、Int32 和 pdwCookie)

我假设这是客户端的一个问题,因为当我尝试做我自己的 ConnnectionPoint 事情以及让框架为我做这件事时,行为一致。但如果它是服务器端的东西:

在 COM 服务器端,我已经这样声明了

coclass MyCOMCoClass
{
    [default] dispinterface MyCOMInterface;
    [default, source] dispinterface MyCOMSource;
};

我的课堂上也有CONNECTION_MAPandCONNECTION_PART宏。

可能发生了什么,我该如何调试?

4

1 回答 1

2

MyEventHandler 的 GUID 必须等于 sourceGuid 并且当前程序集必须是 COMVisible。

于 2011-02-09T00:21:19.983 回答