Compartir a través de


Evitar miembros estáticos en tipos visibles para COM

Actualización: noviembre 2007

Nombre de tipo

AvoidStaticMembersInComVisibleTypes

Identificador de comprobación

CA1407

Categoría

Microsoft.Interoperability

Cambio problemático

No

Motivo

Un tipo que se marca específicamente como visible para 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 con el atributo System.Runtime.InteropServices.ComRegisterFunctionAttribute o con el atributo System.Runtime.InteropServices.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 esta regla se active, un ComRegisterFunctionAttribute de nivel de ensamblado debe estar establecido en false y el ComRegisterFunctionAttribute de clase debe estar establecido 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 obtener acceso a la funcionalidad proporcionada por el método static.

Infracción de ejemplo

Description

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

Description

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

Marcar los ensamblados con ComVisibleAttribute

Evite argumentos Int64 para clientes de Visual Basic 6

Evitar los campos no públicos en los tipos de valor de ComVisible

Vea también

Otros recursos

Interoperar con código no administrado