Поделиться через


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

См. также

Другие ресурсы

Взаимодействие с неуправляемым кодом