CA1407: Evite 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 public static método.
Descrição da regra
COM não suporta static métodos.
Esta regra ignora a propriedade e acessadores de evento, o operador de sobrecarga de métodos ou métodos que são marcados por meio de System.Runtime.InteropServices.ComRegisterFunctionAttribute atributo ou o System.Runtime.InteropServices.ComUnregisterFunctionAttribute atributo.
Por padrão, é visível para COM o seguinte: assemblies, tipos públicos, os 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 o seguinte código mostra.
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 um cliente COM não exigir acesso à funcionalidade fornecida pelo static método.
Violação de exemplo
Descrição
A exemplo a seguir mostra um static método que viola essa regra.
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;
}
}
}
Comentários
Neste exemplo, o Book.FromPages método não pode ser chamado a partir de COM.
Correção de exemplo
Descriçã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 torná-lo, desmarque essa opção para outros desenvolvedores que o método não pode ser visto a partir de COM.
O exemplo a seguir aplica ComRegisterFunctionAttribute para o 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;
}
}
}
Regras relacionadas
CA1017: Assemblies de marca com ComVisibleAttribute
CA1406: Evite argumentos de Int64 para os clientes Visual Basic 6
CA1413: Evitar os tipos de valor visível COM campos não públicos