2010-10-04 6 views
0

J'ai un serveur COM C++ non géré configuré pour déclencher des événements et j'essaie de gérer ces événements à partir de mon application C#.InvalidCastException lors de la configuration du gestionnaire pour l'événement COM

Cependant, je reçois un InvalidCastException lors de la configuration du gestionnaire

myCOMObj.MyCOMEvent += new MyCOMSource_MyCOMEventHandler(handler); 

La trace de la pile montre:

cast spécifié est pas valide. à System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise (Object pUnkSink, Int32 & dwCookie) à MyCOMSource_EventProvider.add_MyCOMEvent (MyCOMSource_MyCOMEventHandler) à MyCOMSource_Event.add_MyCOMEvent (MyCOMSource_MyCOMEventHandler)

J'ai essayé d'installer mon propre IConnectionPoint comme celui-ci

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 est un objet de classe définie comme ceci:

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

Mais je reçois le même InvalidCastException à connectionPoint.Advise avec la trace de la pile

Specified cast is not valide. à System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise (Object pUnkSink, Int32 & pdwCookie)

Je suppose que c'est un problème du côté client en raison du comportement cohérent lorsque je tente de faire mon propre ConnnectionPoint choses et quand je laisse le cadre le faire pour moi. Mais dans le cas où il est quelque chose sur le côté serveur:

Du côté serveur COM je l'ai déclaré comme ça

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

Je les CONNECTION_MAP et CONNECTION_PART macros en place dans ma classe aussi bien.

Que pourrait-il se passer, comment puis-je déboguer cela?

Répondre

1

Le GUID de MyEventHandler doit être égal à sourceGuid ET l'assembly actuel doit être COMVisible.

Questions connexes