CA1407: Evite miembros estáticos en tipos visibles para COM
Nombre de tipo |
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 System.Runtime.InteropServices.ComRegisterFunctionAttribute o 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 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