CA1407 : Éviter les membres statiques dans les types visibles par COM
TypeName |
AvoidStaticMembersInComVisibleTypes |
CheckId |
CA1407 |
Catégorie |
Microsoft.Interoperability |
Modification avec rupture |
Modification sans rupture |
Cause
Un type qui est spécifiquement marqué comme visible par l'objet COM (Component Object Model) contient une méthode public static.
Description de la règle
COM ne prend pas en charge de méthodes static.
Cette règle ignore les accesseurs de propriété et d'événement, les méthodes de surcharge d'opérateur ou les méthodes marquées avec l'attribut System.Runtime.InteropServices.ComRegisterFunctionAttribute ou l'attribut System.Runtime.InteropServices.ComUnregisterFunctionAttribute.
Par défaut, les éléments suivants sont visibles par le modèle COM : assemblys, types publics, membres d'instances publics dans des types publics, et tous les membres de types valeur publics.
Pour que cette règle s'applique, un ComVisibleAttribute de niveau assembly doit avoir la valeur false et la classe- ComVisibleAttribute doit avoir la valeur true, comme l'illustre le code ci-dessous.
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class MyClass
{
public static void DoSomething()
{
}
}
}
Comment corriger les violations
Pour corriger une violation de cette règle, modifiez le design pour utiliser une méthode d'instance qui fournit les mêmes fonctionnalités que la méthode static.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle si un client COM n'a pas besoin d'accéder aux fonctionnalités fournies par la méthode static.
Exemple de violation
Description
L'exemple suivant montre une méthode static qui ne respecte pas cette règle.
Code
using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class Book
{
private Collection<string> _Pages = new Collection<string>();
public Book()
{
}
public Collection<string> Pages
{
get { return _Pages; }
}
// Violates this rule
public static Book FromPages(string[] pages)
{
if (pages == null)
throw new ArgumentNullException("pages");
Book book = new Book();
foreach (string page in pages)
{
book.Pages.Add(page);
} return book;
}
}
}
Commentaires
Dans cet exemple, la méthode Book.FromPages ne peut pas être appelée à partir de COM.
Exemple de correctif
Description
Pour corriger la violation dans l'exemple précédent, vous pouvez modifier la méthode en lui substituant une méthode d'instance, mais cela n'a pas de sens dans ce cas. Une meilleure solution consiste à appliquer explicitement ComVisible(false) à la méthode pour indiquer plus clairement aux autres développeurs que la méthode n'est pas visible à partir de COM.
L'exemple suivant applique ComRegisterFunctionAttribute à la méthode.
Code
using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class Book
{
private Collection<string> _Pages = new Collection<string>();
public Book()
{
}
public Collection<string> Pages
{
get { return _Pages; }
}
[ComVisible(false)]
public static Book FromPages(string[] pages)
{
if (pages == null)
throw new ArgumentNullException("pages");
Book book = new Book();
foreach (string page in pages)
{
book.Pages.Add(page);
}
return book;
}
}
}
Règles connexes
CA1017 : Marquer les assemblys avec ComVisibleAttribute
CA1406 : Éviter les arguments Int64 pour les clients Visual Basic 6
CA1413 : Éviter les champs non publics dans les types valeur visibles par COM