CA1407: Evite miembros estáticos en tipos visibles para COM

TypeName

AvoidStaticMembersInComVisibleTypes

Identificador de comprobación

CA1407

Categoría

Microsoft.Interoperability

Cambio problemático

Poco problemático

Motivo

Un tipo marcado específicamente como visible para el Modelo de objetos componentes (COM) contiene un método publicstatic.

Descripción de la regla

COM no es compatible con métodos static.

Esta regla omite descriptores de acceso de eventos y propiedades, métodos de sobrecarga de operadores o métodos marcados mediante el atributo ComRegisterFunctionAttribute o el atributo ComUnregisterFunctionAttribute.

De manera predeterminada, son visibles para COM: ensamblados, tipos públicos, miembros de instancia públicos de tipos públicos y todos los miembros de tipos de valor públicos.

Para que ocurra esta regla, un ComVisibleAttribute de nivel de ensamblado se debe establecer en false y el ComVisibleAttribute de clase se debe establecer en true, como se muestra en el código siguiente.

using System;
using System.Runtime.InteropServices; 

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

Cómo corregir infracciones

Para corregir una infracción a esta regla, cambie el diseño de forma que se utilice un método de instancia que proporcione la misma funcionalidad que el método static.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si un cliente COM no necesita acceso a la funcionalidad proporcionada por el método static.

Infracción de ejemplo

Descripción

En el siguiente ejemplo se muestra un método static que infringe esta regla.

Código

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

Comentarios

En este ejemplo, no se puede llamar al método Book.FromPages desde COM.

Corrección del ejemplo

Descripción

Para corregir la infracción del ejemplo anterior, podría cambiar el método a un método de instancia, pero eso no tiene sentido en esta instancia.Una solución mejor es aplicar explícitamente ComVisible(false) al método para que los demás programadores vean claramente que el método no es visible desde COM.

En el siguiente ejemplo se aplica ComRegisterFunctionAttribute al método.

Código

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

Reglas relacionadas

CA1017: Marcar los ensamblados con ComVisibleAttribute

CA1406: Evite argumentos Int64 para clientes Visual Basic 6

CA1413: Evite campos no públicos en tipos de valor visibles para COM

Vea también

Otros recursos

Interoperar con código no administrado