CA1407: Evitar los miembros estáticos en tipos visibles a través de COM
Elemento | Valor |
---|---|
RuleId | CA1407 |
Category | Microsoft.Interoperability |
Cambio importante | Poco problemático |
Causa
Un tipo que se marca específicamente como visible para Component Object Model (COM) contiene un método public``static
.
Descripción de la regla
COM no es compatible con métodos static
.
Esta regla omite los descriptores de acceso de propiedades y eventos, los métodos de sobrecarga de operadores o los métodos marcados mediante el atributo System.Runtime.InteropServices.ComRegisterFunctionAttribute o el atributo System.Runtime.InteropServices.ComUnregisterFunctionAttribute.
De forma predeterminada, los siguientes elementos son visibles para COM: ensamblados, tipos públicos, miembros de instancia pública en tipos públicos y todos los miembros de tipos de valor público.
Para que se produzca esta regla, se debe establecer un nivel de ensamblado ComVisibleAttribute en false
y la clase- ComVisibleAttribute debe establecerse 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 de esta regla, cambie el diseño para usar un método de instancia que proporcione la misma funcionalidad que el método static
.
Cuándo suprimir las advertencias
Es seguro suprimir una advertencia de esta regla si un cliente COM no requiere acceso a la funcionalidad proporcionada por el método static
.
Ejemplo de infracción
Descripción
En el ejemplo siguiente 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.
Ejemplo de corrección
Descripción
Para corregir la infracción en el ejemplo anterior, puede cambiar el método a un método de instancia, pero eso no tiene sentido en esta instancia. Una mejor solución consiste en aplicar ComVisible(false)
explícitamente al método para que quede claro a otros desarrolladores que el método no se puede ver desde COM.
En el ejemplo siguiente 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: Evitar los argumentos Int64 en clientes Visual Basic 6
CA1413: Evitar los campos no públicos en tipos de valor visibles a través de COM
Vea también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de