Pourquoi est-ce le marquage d'une assemblée ComVisible(true) découragé?
J'ai toujours marqué mon .NET assemblées comme visible à la COM avec [assembly: ComVisible(true)]
, pensant que je ne sais jamais quand quelqu'un pourrait avoir besoin de les appeler à partir de COM. J'ai aussi commencé à utiliser FxCop et commencé à voir cet avertissement à partir d'analyse de code:
CA1017 : Microsoft.Conception : Parce que "MyLibrary.dll' expose visible de l'extérieur types, il marque avec ComVisible(faux) au niveau de l'assemblage, puis marquez tous les types à l'intérieur de l'assemblée qui doit être exposé à COM clients avec ComVisible(true)
Est-il une raison pourquoi vous ne devrait tout simplement pas envie tous de votre public types exposé à COM? Je devine qu'il est, mais je ne peux pas imaginer ce que cette raison est. Si quoi que ce soit, il semble nettement gênant.
Vous devez vous connecter pour publier un commentaire.
La clé, c'est que l'exportation d'une interface COM ne sont pas gratuits comme il y a des incompatibilités et des exigences qui doivent être respectées. Ce doit être à la fois réfléchi et ensuite maintenue. (Avertissement CA1017 est en faisant allusion à cela.)
Donc j'ai toujours travaillé avec l'option "opt-in" de la philosophie plutôt que de "opt-out", c'est à dire plutôt que de faire tout COM visible, je marque l'assemblée de ne pas COM visibles. J'ai ensuite se concentrer sur la mise en évidence des types d'\membres de manière sélective (c'est à dire en choisissant cette option), et assurez-vous que l'API qui est exposé est sain d'esprit pour COM (par exemple, COM ne prend pas en charge les médicaments génériques, la surcharge de méthode ou de constructeurs qui prennent des paramètres) et aussi qu'il a été testé avec COM à l'esprit. Dans cette façon d'exposer une API pour COM est fait de façon rigoureuse, testé, borné et maintenable la mode.
C'est le contraire de tout COM visibles et ensuite se soucier de tous les problèmes possibles plus tard, en gardant à l'esprit que si vous avez exposés tout, alors il y a peut être des couplages avec les utilisateurs de votre interface COM que vous n'attendez pas et maintenant avoir de la difficulté à la sauvegarde d'.
À partir de la mémoire de quelques exemples des conséquences inattendues:
Lors de l'exportation des méthodes surchargées, ils sont exportés et nommé par défaut avec un numéro de séquence par exemple OverloadedMethod1, OverloadedMethod2, etc. Si vous effectuez un refactoring de code et de modifier l'ordre de vos méthodes ou insérer une surcharge, etc, vous êtes alors en difficulté avec quelqu'un qui a utilisé ces méthodes à partir de votre précédente interface COM. OverloadedMethod1 et OverloadedMethod2 mai ont été échangés.
Classes qui sont exposés à la COM doit avoir un constructeur sans paramètre. Si il n'y a pas une unité de contrôle qui maintient ce contrat, il est facile de changer de classe à une date ultérieure afin de ne pas avoir un constructeur sans paramètre et donc les pauses de votre COM utilisateurs de l'interface.
De référence, si pas au niveau de l'assemblée
ComVisibleAttribute
est appliquée, toutes les classes publiques sont supposées être COM Visibles. Le défaut de marquer une assemblée[assembly: ComVisible(false)]
souvent dans la suite de l'Analyse de Code d'avertissement, même pour les types qui ne sont pas marqués[ComVisible(true)]
:CA1405: COM visible type de types de base devrait être COM visibles
Avec l'arrivée des Génériques et d'autres avancées, il est plus commun aujourd'hui pour les méthodes d'exposer les types qui ne peut pas être COM visibles que c'est pour leur exposer les types qui peut.
La méthode recommandée dans CA1017 est destiné à vous encourager à exposer seulement ces types qui vous l'intention d'être exposé à COM.
Marquage de l'assemblée de COM visible est très utile lorsque vous avez un tas de classes publiques à l'intérieur que vous ne voulez pas vous exposer à COM. Ces classes peuvent par exemple être des classes proxy web serive votre assemblée en consomme. Soit vous de bien marquer chaque classe pas COM visibles ou vous contentez-vous de marquer l'assemblée de ne pas COM en évidence, puis marquez chaque classe pour exposer COM. C'est un degré beaucoup plus élevé de contrôle et moins d'entretien.
C'est facile et donné sur MSDN. C'est la façon de comment résoudre ce problème avertissement:
Si la classe de Base est dans une dll qui vous faites référence dans votre code. Ensuite, Faire [COMVisibible(True)] pour la classe dérivée. Il fonctionne dans mon scénario.