CA1407 : Éviter les membres statiques dans les types visibles par COMCA1407: Avoid static members in COM visible types

TypeNameTypeName AvoidStaticMembersInComVisibleTypesAvoidStaticMembersInComVisibleTypes
CheckIdCheckId CA1407CA1407
CategoryCategory Microsoft.InteroperabilityMicrosoft.Interoperability
Modification avec ruptureBreaking Change Sans ruptureNon-breaking

CauseCause

Un type qui est marqué spécifiquement comme visible pour COM Component Object Model () contient un public``static (méthode).A type that is specifically marked as visible to Component Object Model (COM) contains a public``static method.

Description de la règleRule description

COM ne prend pas en charge static méthodes.COM does not support static methods.

Cette règle ignore la propriété et les accesseurs d’événement, les méthodes ou des méthodes qui sont marqués à l’aide de la surcharge d’opérateur la System.Runtime.InteropServices.ComRegisterFunctionAttribute attribut ou le System.Runtime.InteropServices.ComUnregisterFunctionAttribute attribut.This rule ignores property and event accessors, operator overloading methods, or methods that are marked by using either the System.Runtime.InteropServices.ComRegisterFunctionAttribute attribute or the System.Runtime.InteropServices.ComUnregisterFunctionAttribute attribute.

Par défaut, les éléments suivants sont visibles par COM : assemblys, types publics, membres d’instance publics dans les types publics et tous les membres de types valeur publics.By default, the following are visible to COM: assemblies, public types, public instance members in public types, and all members of public value types.

Pour cette règle se produisent, un niveau de l’assembly ComVisibleAttribute doit être définie sur false et la classe - ComVisibleAttribute doit être définie sur true, comme illustré dans le code suivant.For this rule to occur, an assembly-level ComVisibleAttribute must be set to false and the class- ComVisibleAttribute must be set to true, as the following code shows.

using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace Samples
{
    [ComVisible(true)]
    public class MyClass
    {
        public static void DoSomething()
        {
        }
    }
}

Comment corriger les violationsHow to fix 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 le static (méthode).To fix a violation of this rule, change the design to use an instance method that provides the same functionality as the static method.

Quand supprimer les avertissementsWhen to suppress warnings

Il est possible de supprimer un avertissement de cette règle si un client COM ne nécessite pas d’accès à la fonctionnalité fournie par le static (méthode).It is safe to suppress a warning from this rule if a COM client does not require access to the functionality that is provided by the static method.

Exemple de ViolationExample Violation

DescriptionDescription

L’exemple suivant montre un static méthode qui enfreint cette règle.The following example shows a static method that violates this rule.

CodeCode

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

CommentairesComments

Dans cet exemple, le Book.FromPages méthode ne peut pas être appelée à partir de COM.In this example, the Book.FromPages method cannot be called from COM.

Exemple de correctifExample Fix

DescriptionDescription

Pour corriger la violation dans l’exemple précédent, vous pouvez modifier la méthode à une méthode d’instance, mais qui n’est pas pertinent dans cette instance.To fix the violation in the previous example, you could change the method to an instance method, but that does not make sense in this instance. Une meilleure solution consiste à appliquer explicitement ComVisible(false) à la méthode pour indiquer clairement à d’autres développeurs que la méthode ne peut pas être visible à partir de COM.A better solution is to explicitly apply ComVisible(false) to the method to make it clear to other developers that the method cannot be seen from COM.

L’exemple suivant applique ComRegisterFunctionAttribute à la méthode.The following example applies ComRegisterFunctionAttribute to the method.

CodeCode

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 : Marquez les assemblys avec ComVisibleAttributeCA1017: Mark assemblies with ComVisibleAttribute

CA1406 : Éviter les arguments Int64 pour les clients Visual Basic 6CA1406: Avoid Int64 arguments for Visual Basic 6 clients

CA1413 : Évitez les champs non publics dans les types valeur visibles par COMCA1413: Avoid non-public fields in COM visible value types

Voir aussiSee also

Interopération avec du code non managéInteroperating with Unmanaged Code