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.

Другие вопросы по тегам