2013-08-21 2 views
2

Je crée donc un plugin Outlook avec NetOffice.GuidAttribute & ProgId, à quoi servent-ils?

Sur le point d'entrée du plugin, il a quelque chose comme ceci:

[GuidAttribute("d7066ab2-ac03-431a-bea5-b70d3efab2a5"), ProgId("OutlookPlugin"), ComVisible(true)]

Maintenant, je comprends que le bit ComVisible définit la bibliothèque comme, eh bien, ComVisible. Je suppose que c'est pour que je puisse créer des classes individuelles ComVisible plutôt que toute la bibliothèque via Information d'assemblage -> Rendre l'assemblage COM-Visible. Mais je ne comprends pas ce que les GuidAttribute et ProgId sont utilisés?

Répondre

4

Une caractéristique importante de COM est qu'une application peut demander la création de l'objet de classe et que COM détermine quel exécutable l'implémente et le charge pour vous. Cela nécessite un bon moyen d'identifier le composant.

Vous diriez: "eh bien, pas de problème, donnez-lui simplement un nom". Le problème est, les gens ne sont pas très bons pour choisir de bons noms. Il y a tout un groupe de gars appelés "Hans" et je connais au moins un autre gars qui a mon nom exact. Il habite quelque part aux Pays-Bas, je ne sais pas qui il est.

C'est un problème, contrairement aux noms de personnes, les collisions de noms de composants sont mortelles. Vous obtiendrez le composant complètement faux chargé et votre programme va planter. Les concepteurs de COM ont donc décidé que la seule bonne solution est un ID unique au monde, un numéro qui est garanti unique dans l'univers connu et au-delà. Un GUID.

Une application COM utilise ce numéro pour demander la création de l'objet. La fonction api sous-jacente est CoCreateInstance, le premier argument est le CLSID qui est le guid qui identifie la classe.

Les gens ne sont cependant pas très bons pour se souvenir de très longs nombres. Il existe donc une méthode de sauvegarde pour identifier un composant, elle est notamment utilisée dans les langages de script. Le type d'environnement d'exécution dans lequel obtenir cette valeur guidée de manière fiable n'est pas si facile. Donc, il y a toujours un nom attaché au numéro. C'est le ProgId. Vous le passez à une fonction d'assistance généralement appelée CreateObject(). Il fait une étape supplémentaire, il utilise la fonction d'assistance CLSIDFromProgID() pour mapper le nom sur le numéro, puis appelle CoCreateInstance. Inutile de dire que cela peut parfois aller mal.

+0

Je pense que c'est une meilleure réponse - merci. – Cheetah

2

Toutes les classes COM - également appelées CoClass (es) - et les interfaces sont identifiées par leur GUID (également appelé CLSID et IID respectivement). Les CoClasses ont aussi un ProgID qui est une sorte de nom convivial. Tous ces éléments sont stockés dans le Registre lorsque le composant COM ou l'ensemble COM-Visible sont enregistrés (respectivement avec RegSvr32.exe ou RegAsm.exe) et se référencent mutuellement.

+0

Pourquoi devrais-je les définir? Je ne peux pas les avoir générés automatiquement à partir de .NET? Puis-je simplement utiliser le même GUID de l'assembly? – Cheetah

+0

Il peut y avoir plusieurs CoClasses et interfaces dans un assembly. Et si elles étaient générées automatiquement à chaque compilation, comment garantirez-vous qu'elles resteront les mêmes? Vous êtes supposé les avoir générés * une fois * avec le programme approprié (uuidgen.exe ou sa GUI version guidgen.exe, invocable depuis le menu ** Tools ** de Visual Studio) et les enregistrer dans votre code source. – Medinoc

+0

Ok, donc c'est seulement pour les classes ComVisible? (C'est à dire la classe de point d'entrée dans mon application). Étant donné que mon Assemblée n'est pas visible, puis-je utiliser ce guid? Ou est-ce la meilleure pratique de les avoir tous différents? – Cheetah

1

Pour ProgId, je pense que la documentation est tout à fait clair sur son utilisation:

ProgIDs sont générés automatiquement pour une classe en combinant l'espace de noms avec le nom du type. Cela peut cependant produire un ProgID non valide, car les ProgID sont limités à 39 caractères et ne peuvent contenir aucune ponctuation autre qu'un point. Dans ce cas, un ProgID peut être assigné manuellement à la classe en utilisant ProgIdAttribute.

La raison ne figure pas ici est que l'attribution manuellement rend cohérente construit à travers.