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;
        }
    }
}

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

Interopération avec du code non managé