2010-01-15 5 views
14

Lors de l'enregistrement manuel d'une classe gérée pour COM Interop, certaines clés de registre sont nécessaires. Par exempleLa clé 'Implemented Categories' est-elle nécessaire lors de l'enregistrement d'un composant COM géré?

HKEY_CLASSES_ROOT 
    CLSID\[My Cls Id] 
    InprocServer32 
    (Default) = "mscoree.dll" 
    Assembly = [My assembly name] 
    etc. 

J'ai remarqué que lorsque VS enregistre une bibliothèque pour COM Interop, il ajoute également une touche

HKEY_CLASSES_ROOT 
    CLSID\[My Cls Id] 
    Implemented Categories 
     {62C8FE65-4EBB-45e7-B440-6E39B2CDBF29} 

Quelle est cette clé pour, et est-il absolument nécessaire? Pour autant que je sache, la vie se passe bien sans elle, mais peut-être que je ne rencontre pas les circonstances où cela est nécessaire.

Répondre

23

Il s'agit d'un CATID, une catégorie de composants. Un hôte de contrôle peut l'utiliser, par exemple, pour filtrer des éléments qui apparaissent dans une boîte à outils, mais uniquement ceux qui implémentent un ensemble d'interfaces attendu.

Vous pouvez voir une liste des catégories de composants connues dans la clé de registre HKCR\Component Categories. Celui que Regasm.exe utilise signifie que "ce serveur COM est implémenté dans .NET". Il est utile de savoir qu'un programme .NET ne doit pas utiliser un serveur COM implémenté dans un langage géré. Il doit utiliser directement les métadonnées de l'assembly.

Les CATID ne sont pas bien documentés. Ce qui les rend assez inutiles, vous aurez rarement des problèmes si vous les omettez simplement. Si un fournisseur d'hôte de contrôle requiert que vous utilisiez un système CATID pour rendre votre serveur COM utilisable sur son hôte, il vous en informera explicitement.

+0

Hans - réponse utile merci. Voulez-vous dire "un programme .NET ne peut pas utiliser un serveur COM qui est implémenté dans un langage * un * géré" plutôt que "langage géré"? Plus sur les CATID à http://msdn.microsoft.com/en-us/magazine/cc301432.aspx –

+0

@Simon: non, les serveurs COM sont normalement implémentés dans un langage non géré. –