2010-10-04 4 views
0

У меня есть неуправляемый COM-сервер C++, который настроен для запуска событий, и я пытаюсь обработать эти события из моего приложения C#.InvalidCastException при настройке обработчика для COM-события

Однако я получаю 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 
... 

Но я получить то же InvalidCastException в connectionPoint.Advise с трассировкой стека

Указанных литой не действуют. в System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise (Object pUnkSink, Int32 & pdwCookie)

Я предполагаю, что это вопрос, на стороне клиента из-за последовательного поведения, когда я пытаюсь сделать мой собственный Материалы ConnnectionPoint и когда я позволяю фреймворку делать это для меня. Но в случае, если это что-то на стороне сервера:

На стороне сервера COM я объявил его как этот

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

У меня есть CONNECTION_MAP и CONNECTION_PART макросы на месте в своем классе, а также.

Что может происходить, как я могу отладить это?

ответ

1

GUID MyEventHandler должен равняться sourceGuid И текущая сборка должна быть COMVisible.

Смежные вопросы