CA1407: не используйте статические члены в видимых COM типах
TypeName |
AvoidStaticMembersInComVisibleTypes |
CheckId |
CA1407 |
Категория |
Microsoft.Interoperability |
Критическое изменение |
Не критическое |
Причина
Тип, который специально помечен как видимый для COM, содержит метод publicstatic.
Описание правила
COM не поддерживает методы static.
Данное правило не распространяется на методы доступа к свойствам и событиям, методы перегрузки операторов и методы, помеченные атрибутом ComRegisterFunctionAttribute или ComUnregisterFunctionAttribute.
По умолчанию для модели COM видимы следующие объекты: сборки, общие типы, члены общих экземпляров в общих типах и все элементы общих типов значений.
Для применения данного правила атрибуту ComVisibleAttribute уровня сборки должно быть присвоено значение false, а атрибуту ComVisibleAttribute уровня класса — значение true, как показано в следующем коде.
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class MyClass
{
public static void DoSomething()
{
}
}
}
Устранение нарушений
Чтобы устранить нарушение данного правила, измените структуру кода таким образом, чтобы вместо метода с модификатором static использовать метод экземпляра, предоставляющий ту же функциональность.
Отключение предупреждений
Отключение предупреждений о нарушении данного правила безопасно в том случае, если COM-клиенту не требуется получать доступ к функциональности, предоставляемой методом с модификатором static.
Пример нарушения
Описание
В следующем примере показан метод static, который нарушает данное правило.
Код
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;
}
}
}
Комментарии
В этом примере метод Book.FromPages не может быть вызван клиентом COM.
Исправление нарушения в примере
Описание
Чтобы устранить нарушение из предыдущего примера, можно было бы заменить показанный метод на метод экземпляра, однако в данном случае это нецелесообразно.Более правильным решением является явное применение к методу атрибута ComVisible(false), чтобы ясно указать другим разработчикам на невидимость данного метода для COM.
В следующем примере к методу применяется атрибут ComRegisterFunctionAttribute.
Код
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;
}
}
}
Связанные правила
CA1017: помечайте сборки атрибутом ComVisibleAttribute
CA1406: не следует использовать аргументы Int64 для клиентов Visual Basic 6
CA1413: избегайте использования не открытых полей в видимых типах значений COM