Question

J'écris une bibliothèque de classes (IE BHO) en C # et je suis actuellement en conflit avec le volume important de ce que je pense être une sortie indésirable provenant des clés de registre générées par REGASM.

La version courte est la suivante: je ne souhaite exposer qu’une poignée de classes (actuellement: ONE classe) à IE (et au reste de COM). ClassInterfaceAttribute et le GUID sont définis dans une seule classe et je peux vérifier que le module complémentaire ne nécessite que les clés de registre COM de cette classe - et pourtant, REGASM génère des GUID et des clés de registre pour chaque classe du projet entier.

C’est ennuyeux et quelque peu dérangeant car je ne veux pas que les noms de mes classes soient conservés dans le registre des utilisateurs, sauf si ils doivent absolument y être.

Pour être juste, beaucoup de ces autres classes sont marquées comme publiques parce que je les utilise dans une application de pilote d'un autre projet de la même solution, afin de contourner le trou noir de débogage d'IE ...

Je suis toujours très vert envers COM en général (particulièrement en ce qui concerne .Net) et je me demandais quel était le meilleur moyen de cacher toutes mes autres classes de regasm? Ou, du moins, pourquoi ces classes qui, même si elles sont marquées comme publiques, apparaissent alors que je ne mets aucun des indicateurs COM pour elles?

Merci!

Était-ce utile?

La solution

Utilisez le modificateur d'accès interne pour les éléments qui ne nécessitent pas de modificateur public . Pour les éléments nécessitant réellement un accès public , utilisez l'attribut ComVisible pour le masquer partiellement.

Par exemple:

[ComVisible(false)]
public class ClassToHide {
    //whatever
};

public class ClassToExpose {

     public void MethodToExpose() {}

     [ComVisible(false)]
     public void MethodToHide() {}
};

Toutes les fonctions membres publiques et les variables membres de toutes les classes publiques sont visibles par défaut par COM. Alors, pensez d'abord à les rendre internes et si vous en avez vraiment besoin, cachez-les de COM avec ComVisible.

Autres conseils

Essayez d’utiliser le commutateur / regfile - cela produira un fichier reg au lieu d’écrire directement tous vos noms de classes dans le registre.

Lorsque vous avez le fichier .reg, vous pouvez supprimer les entrées que vous ne souhaitez pas ajouter au registre des systèmes cibles et déployer uniquement ces valeurs sur la machine cible. Selon la manière dont vous choisissez de déployer votre logiciel, cela pourrait être plus facile et vous ne seriez pas obligé de changer le code pour aucun de vos types.

En fait, si vous n'avez pas accès au code source, ce sera le seul moyen d'y parvenir.

J'ai écrit un composant COM avec les mêmes problèmes.

J'ai séparé toutes les fonctions non-COM dans une DLL d'assistance distincte. La DLL COM contient uniquement le code qui doit être enregistré. Tout le reste est accessible via la DLL d'assistance.

J'ai trouvé un moyen simple de faire en sorte que le code futur ne soit pas accidentellement marqué comme public plutôt que interne et s'affiche dans le registre.

Définissez l'attribut ComVisible sur false dans le fichier AssemblyInfo et appliquez ComVisible uniquement aux classes souhaitées.

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