CA1407: Evitar los miembros estáticos en tipos visibles a través de COM

Elemento Valor
RuleId CA1407
Category Microsoft.Interoperability
Cambio importante Poco problemático

Causa

Un tipo que se marca específicamente como visible para Component Object Model (COM) contiene un método public``static.

Descripción de la regla

COM no es compatible con métodos static.

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

De forma predeterminada, los siguientes elementos son visibles para COM: ensamblados, tipos públicos, miembros de instancia pública en tipos públicos y todos los miembros de tipos de valor público.

Para que se produzca esta regla, se debe establecer un nivel de ensamblado ComVisibleAttribute en false y la clase- ComVisibleAttribute debe establecerse 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 de esta regla, cambie el diseño para usar un método de instancia que proporcione la misma funcionalidad que el método static.

Cuándo suprimir las advertencias

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

Ejemplo de infracción

Descripción

En el ejemplo siguiente 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.

Ejemplo de corrección

Descripción

Para corregir la infracción en el ejemplo anterior, puede cambiar el método a un método de instancia, pero eso no tiene sentido en esta instancia. Una mejor solución consiste en aplicar ComVisible(false) explícitamente al método para que quede claro a otros desarrolladores que el método no se puede ver desde COM.

En el ejemplo siguiente 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;
        }
    }
}

CA1017: Marcar los ensamblados con ComVisibleAttribute

CA1406: Evitar los argumentos Int64 en clientes Visual Basic 6

CA1413: Evitar los campos no públicos en tipos de valor visibles a través de COM

Vea también

Interoperar con código no administrado