InvalidCastException при настройке обработчика для события COM
У меня есть неуправляемый COM-сервер C++, который настроен на запуск событий, и я пытаюсь обработать эти события из моего приложения C#.
Тем не менее, я получаю InvalidCastException при настройке обработчика
myCOMObj.MyCOMEvent += new MyCOMSource_MyCOMEventHandler(handler);
Трассировка стека показывает:
Указанный состав недействителен. в System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(объект pUnkSink, Int32& dwCookie) в MyCOMSource_EventProvider.add_MyCOMEvent(MyCOMSource_MyCOMEventHandler) в MyCOMSource_MyCoCvent_MyCource_MCOMSource_MyCourceSvent_MyCource_MCOMSource_MC.Cvent.MventCvent_MC.Cvent.MventCvent_MCOMSource_MC.Cvent.MventCvent_MC.COM
Я попытался настроить свой собственный 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
...
Но я получаю то же InvalidCastException в connectionPoint.Advise
с трассировкой стека
Указанный состав недействителен. в System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(объект pUnkSink, Int32& pdwCookie)
Я предполагаю, что это проблема на стороне клиента из-за непротиворечивого поведения, когда я пытаюсь сделать свой собственный материал ConnnectionPoint и когда я позволяю платформе делать это для меня. Но в случае, если это что-то на стороне сервера:
На стороне сервера COM я объявил это так
coclass MyCOMCoClass
{
[default] dispinterface MyCOMInterface;
[default, source] dispinterface MyCOMSource;
};
у меня есть CONNECTION_MAP
а также CONNECTION_PART
макросы на месте в моем классе, а также.
Что может происходить, как я могу отладить это?
1 ответ
GUID MyEventHandler должен равняться sourceGuid, а текущая сборка ДОЛЖНА быть COMVisible.