2010-08-19 6 views
2

Lors de l'utilisation de regasm pour enregistrer un assembly pour COM interop, il crée une clé de registre HKEY_CLASSES_ROOT \ CLSID {000 ... 000} avec une valeur par défaut du ProgId de la classe COM (voir article MSDN Registering Assemblies with COM).Est-il possible de spécifier la valeur par défaut de la clé de registre ClassID créée par regasm?

Est-il possible de spécifier la chaîne que regasm définit comme valeur par défaut de la clé? C'est à dire. Donnez-lui un nom plus significatif?

Par exemple:

HKEY_CLASSES_ROOT \ CLSID {000 ... 000} \ default = "Nom descriptif pour ma classe vraiment utile"

au lieu de:

HKEY_CLASSES_ROOT \ CLSID {000 ... 000} \ Default = "An.Obscure.Prog.Id"

Je suppose qu'il serait possible de modifier les valeurs du registre après que regasm les ait définies, mais il serait plus facile si je pouvais simplement persuader regasm de le faire.

Répondre

1

Je pense que la question et la réponse ont tort. Il y a trois noms impliqués ici:

  1. Le ClassId ou GUID, avec le format familier, par ex. "{F4754C9B-64F5-4B40-8AF4-679732AC0607}"
  2. Le nom ProgId ou programmatique, qui doit être formaté en tant que Vendor.Component.Version (voir http://msdn.microsoft.com/en-us/library/aa911706.aspx) - par exemple. «Word.Document.12»
  3. Le nom lisible par l'utilisateur - c'est le nom qui est généralement affiché dans une liste de composants COM (comme la boîte de dialogue Ajouter une référence/COM dans VS ou Insérer -> objets dans les applications OLE), par exemple "Microsoft Word"

Les entrées correspondantes dans le Registre sont:

CLASSES_ROOT\CLSID\ClassId @= "Human readable name" 
CLASSES_ROOT\CLSID\ClassId\ProgId @= "ProgId" 
CLASSES_ROOT\ProgId @= "Human readable name" 
CLASSES_ROOT\ProgId\CLSID @= "ClassId" 

Voir votre registre pour quelques exemples.

Si vous réfléchissez sur regasm.exe, vous verrez qu'il utilise toujours Type.FullName comme nom lisible par un humain. C'est une douleur dans le cul, car cela signifie que vous devez définir le HRN en utilisant un crochet d'enregistrement com. Il aurait été assez facile pour eux de rechercher l'attribut DisplayName, par exemple, et de l'utiliser à la place. Quoi qu'il en soit, voici une fonction d'aide qui définit les entrées HRN. Appelez-le à partir de votre crochet d'enregistrement.

Pour plus de détails sur les crochets d'enregistrement COM voir http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comregisterfunctionattribute.aspx

public static void SetHumanReadableName(Type t, string humanReadableName) 
{ 
    var classKeyName = string.Format(@"CLSID\{{{0}}}", t.GUID); 
    var classKey = Registry.ClassesRoot.OpenSubKey(classKeyName, true); 
    if (classKey == null) 
     return; 
    classKey.SetValue(string.Empty, humanReadableName); 
    // if it has a progid set the HRN on the progid entry too 
    foreach (ProgIdAttribute progId in t.GetCustomAttributes(typeof(ProgIdAttribute), false)) 
    { 
     var progIdKey = Registry.ClassesRoot.OpenSubKey(progId.Value, true); 
     if (progIdKey != null) 
      progIdKey.SetValue(string.Empty, humanReadableName); 
    } 
} 
2

dans votre classe qui a la fonction RegisterClass() pour se faire enregistrer pour COM Interop il y a plusieurs Attrubutes vous devez ajouter

[ProgId("Descriptive name for my really useful class")] 
[Guid("000000-23FD-4F6F-8B50-0000000")] 

dans Guid attribut il est guid qui va à HKEY_CLASSES_ROOT \ CLSID

dans ProgID est le nom significatif que vous voulez.

En fait, il est recommenté d'avoir ProgID comme nom d'espace de noms + nom de classe donc vous feriez mieux de renommer votre projet de classe (et) en un nom plus significatif.

Questions connexes