Partager via


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

Voir aussi

Autres ressources

Interopération avec du code non managé