Compartilhar via


CA1407: Evitar membros estáticos em tipos de visíveis COM

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

<strong>Categoria</strong>

Microsoft.Interoperability

Alteração significativa

Não-separável

Causa

Um tipo que está especificamente marcado como visível para o modelo de objeto componente (COM) contém um publicstatic método.

Descrição da regra

COM não oferece suporte static métodos.

Esta regra ignora a propriedade e acessadores de evento, o sobrecarregamento de métodos ou métodos marcados, usando o System.Runtime.InteropServices.ComRegisterFunctionAttribute atributo ou o System.Runtime.InteropServices.ComUnregisterFunctionAttribute atributo.

Por padrão, a seguir estão visível para COM: assemblies, tipos públicos, membros de instância pública em tipos públicos e todos os membros de tipos de valor público.

Para esta regra ocorra, um nível de conjunto ComVisibleAttribute deve ser definido como false e a classe - ComVisibleAttribute deve ser definido como true, como mostra o código a seguir.

using System;
using System.Runtime.InteropServices; 

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

Como corrigir violações

Para corrigir uma violação desta regra, alterar o design para usar um método de instância que fornece a mesma funcionalidade que o static método.

Quando suprimir avisos

É seguro eliminar um aviso esta regra se não exigir acesso à funcionalidade fornecida por um cliente COM o static método.

Violação de exemplo

ms182198.collapse_all(pt-br,VS.110).gifDescrição

A exemplo a seguir mostra um static método que viola essa regra.

ms182198.collapse_all(pt-br,VS.110).gifCó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;        
        }    
    }
}

ms182198.collapse_all(pt-br,VS.110).gifComentários

Neste exemplo, o Book.FromPages método não pode ser chamado a partir de COM.

Correção de exemplo

ms182198.collapse_all(pt-br,VS.110).gifDescrição

Para corrigir a violação no exemplo anterior, você pode alterar o método para um método de instância, mas que não faz sentido nesta instância.Uma solução melhor é explicitamente aplicar ComVisible(false) para o método para deixar mais claro para outros desenvolvedores que o método não pode ser visto a partir de COM.

O exemplo a seguir aplica-se ComRegisterFunctionAttribute para o método.

ms182198.collapse_all(pt-br,VS.110).gifCó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;
        }
    }
}

Regras relacionadas

CA1017: Marcar assemblies com ComVisibleAttribute

CA1406: Evitar Int64 argumentos para os clientes de 6 Visual Basic

CA1413: Evite campos não públicos em tipos de valor visível COM

Consulte também

Outros recursos

Interoperar com código não gerenciado