CA1407 : Éviter les membres statiques dans les types visibles par COM
Élément | Valeur |
---|---|
ID de la règle | CA1407 |
Category | Microsoft.Interoperability |
Modification avec rupture | Sans rupture |
Cause
Un type spécifiquement marqué comme visible pour le modèle objet de composant (COM) contient une méthode public``static
.
Description de la règle
COM ne prend pas en charge les méthodes static
.
Cette règle ignore les accesseurs de propriétés et d’événements, les méthodes de surcharge d’opérateur ou les méthodes marquées à l’aide de l’attribut System.Runtime.InteropServices.ComRegisterFunctionAttribute ou de l’attribut System.Runtime.InteropServices.ComUnregisterFunctionAttribute.
Par défaut, les éléments suivants sont visibles pour COM : assemblys, types publics, membres d’instance publique dans les types publics et tous les membres des types de valeur publique.
Pour que cette règle se produise, un niveau assembly ComVisibleAttribute doit être défini sur false
et la classe- ComVisibleAttribute doit être défini sur true
, comme le montre le code suivant.
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 la conception pour utiliser une méthode d’instance qui fournit les mêmes fonctionnalités que la méthode static
.
Quand supprimer les avertissements
Vous pouvez supprimer un avertissement de cette règle si un client COM n’a pas besoin d’accéder à la fonctionnalité fournie par la méthode static
.
Exemple de violation
Description
L’exemple suivant montre une méthode static
qui enfreint 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 méthode d’instance, mais cela n’a pas de sens dans cette instance. Une meilleure solution consiste à appliquer ComVisible(false)
explicitement à la méthode pour indiquer clairement aux autres développeurs que la méthode ne peut pas être vue à 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 associées
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
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour