我有一个非托管 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_MAP
andCONNECTION_PART
宏。
可能发生了什么,我该如何调试?