Question

Je cet article pour l'enregistrement des événements via COM SENS, mais je pense que je manque quelque chose. J'appelle la méthode SubscribeToEvents l'article dit écrire, comme ceci:

EventSystemRegistrar.SubscribeToEvents("ManagedSENS EventSubscriber", "ManagedSENS.SensLogonInterop", subscriptionViewerID, this, typeof(SensLogon));

ce qui conduit à cette méthode s'appelle:

private static String GetInterfaceGuid(Type type)
{
    Object[] attributes = type.GetCustomAttributes(typeof(GuidAttribute), true);

    return String.Format("{{{0}}}", ((GuidAttribute)attributes[0]).Value);
}

Le problème est, le type il y a la classe SensLogon ils conseillent l'écriture, mais il n'a pas d'attributs à ce sujet, de sorte que cette méthode génère une exception. Les seuls attributs, qui sont, en fait, GuidAttributes, disent-ils à écrire sont sur ces classes, qui n'a rien à voir avec la classe SensLogon (au moins autant que je peux dire):

[ComImport, Guid("4E14FBA2-2E22-11D1-9964-00C04FBBB345")]
class EventSystem { }
[ComImport, Guid("7542E960-79C7-11D1-88F9-0080C7D771BF")]
class EventSubcription { }
[ComImport, Guid("AB944620-79C6-11d1-88F9-0080C7D771BF")]
class EventPublisher { }
[ComImport, Guid("cdbec9c0-7a68-11d1-88f9-0080c7d771bf")]
class EventClass { }

Peut-être que je manque quelque chose ici? Devais-je tirer de ces classes ou quelque chose? La classe SensLogon est montré, mais il ne dispose d'aucune de ces attributs.

Quelqu'un at-il fait quelque chose de similaire pour enregistrer des événements COM, ou peut, peut-être, voir où j'ai suivi l'article mal?

Était-ce utile?

La solution 2

Je compris. Je passais typeof (SensLogon) dans EventSystemRegistrar.SubscribeToEvents, quand je viens de passer typeof (ISensLogon) (ISensLogon a en effet un GuidAttribute dessus). Idiot moi.

Autres conseils

Je pense que votre code est dangereux, parce que vous êtes en supposant l'appel à type.GetCustomAttributes(...) travaillé sans vérifier .... J'envelopper cela dans un bloc try / catch pour voir ce qui se passe ... et inspecter l'exception ...

private static String GetInterfaceGuid(Type type) 
{ 
    string sGuid = string.Empty;
    try{
        Object[] attributes = type.GetCustomAttributes(typeof(GuidAttribute), true); 
        if (attributes != null && attributes.Length >= 1){
           sGuid = String.Format("{{{0}}}", ((GuidAttribute)attributes[0]).Value); 
        }else{
           // FAIL!
        }
    }catch(System.Exception up){
        throw up;
    }
    return sGuid;
} 

Est-ce que le ess.dll s'enregistré du tout? Vous devez vous enregistrer manuellement? Vérifiez le registre pour les id de classe de sous HKEY_CLASSES_ROOT, regardez l'id typelib ... si elles ne sont pas là, alors ce regsvr32 ess.dll émettre où jamais le fichier dll est situé dans le dossier en cours.

Hope this helps, Meilleures salutations, Tom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top