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