Je pense que la question et la réponse ont tort. Il y a trois noms impliqués ici:
- Le ClassId ou GUID, avec le format familier, par ex. "{F4754C9B-64F5-4B40-8AF4-679732AC0607}"
- 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»
- 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);
}
}