Les types de base type visibles par COM doivent être visibles par COM
Mise à jour : novembre 2007
TypeName |
ComVisibleTypeBaseTypesShouldBeComVisible |
CheckId |
CA1405 |
Catégorie |
Microsoft.Interoperability |
Modification avec rupture |
DependsOnFix |
Cause
Un type visible par COM dérive d'un type qui n'est pas visible par COM.
Description de la règle
Lorsqu'un type visible par COM ajoute des membres dans une nouvelle version, il doit se conformer strictement aux instructions pour éviter de bloquer des clients COM qui se lient à la version actuelle. Un type qui est invisible dans COM suppose qu'il n'a pas besoin de respecter ces règles de versioning COM lorsqu'il ajoute de nouveaux membres. Toutefois, si un type visible par COM dérive du type invisible par COM et expose une interface de classe de ClassInterfaceType.AutoDual ou AutoDispatch (valeur par défaut), tous les membres publics du type de base (sauf s'ils sont marqués spécifiquement comme étant invisibles par COM, auquel cas, ils sont redondants) sont exposés dans COM. Si le type de base ajoute de nouveaux membres dans une version suivante, les clients COM qui se lient à l'interface de classe du type dérivé peuvent être bloqués. Les types visibles par COM doivent dériver uniquement de types visibles par COM pour éviter toute possibilité de blocage des clients COM.
Comment corriger les violations
Pour corriger une violation de cette règle, faites en sorte que les types de base soient visibles par COM ou que le type dérivé soit invisible par COM.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L'exemple suivant affiche un type qui enfreint la règle.
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary
<ComVisibleAttribute(False)> _
Public Class BaseClass
Sub SomeSub(valueOne As Integer)
End Sub
End Class
' This class violates the rule.
<ComVisibleAttribute(True)> _
Public Class DerivedClass
Inherits BaseClass
Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
End Sub
End Class
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
[ComVisible(false)]
public class BaseClass
{
public void SomeMethod(int valueOne) {}
}
// This class violates the rule.
[ComVisible(true)]
public class DerivedClass : BaseClass
{
public void AnotherMethod(int valueOne, int valueTwo) {}
}
}
Voir aussi
Concepts
Présentation de l'interface de classe
Référence
System.Runtime.InteropServices.ClassInterfaceAttribute