Udostępnij za pośrednictwem


CA1407: Uniknąć elementy statyczne w typach widoczne COM

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

Kategoria

Microsoft.Interoperability

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ, który jest oznaczony jako widoczny dla Component Object Model (COM) zawiera metodę publicstatic.

Opis reguły

COM nie obsługuje metody static.

Ta reguła ignoruje akcesory właściwości i zdarzeń, metody przeciążające operatory lub metody, które są oznaczone poprzez użycie atrybutu System.Runtime.InteropServices.ComRegisterFunctionAttribute lub atrybutu System.Runtime.InteropServices.ComUnregisterFunctionAttribute.

Domyślnie następujące elementy są widoczne dla COM: zestawy, typy publiczne, publiczne wystąpienia członkowskie w typach publicznych oraz wszystkie elementy członkowskie o publicznych typach wartościowych.

Aby ta reguła wystąpiła, poziom zestawu ComVisibleAttribute musi być ustawiony na false i klasa- ComVisibleAttribute musi być ustawiony na true, jak pokazuje poniższy kod

using System;
using System.Runtime.InteropServices; 

[assembly: ComVisible(false)] 
namespace Samples
{    
    [ComVisible(true)]
    public class MyClass
    {
        public static void DoSomething()
        {
        }
    }
}

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zmienić projekt, tak żeby używał metody wystąpienia, która zapewnia takie same funkcje jak metoda static.

Kiedy pominąć ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli klient COM nie wymaga dostępu do funkcji, dostarczonej przez metodę static.

Przykład naruszenia

ms182198.collapse_all(pl-pl,VS.110).gifOpis

W poniższym przykładzie przedstawiono metodę static, która narusza tą regułę.

ms182198.collapse_all(pl-pl,VS.110).gifKod

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;        
        }    
    }
}

ms182198.collapse_all(pl-pl,VS.110).gifKomentarze

W tym przykładzie metoda Book.FromPages nie może być wywołana z COM.

Przykładowa poprawka

ms182198.collapse_all(pl-pl,VS.110).gifOpis

Aby poprawić naruszenie z poprzedniego przykładu, można zmienić metodę na metodę wystąpienia, ale to nie ma sensu w tym przykładzie.Lepszym rozwiązaniem jest jawne zastosowania ComVisible(false) do metody, aby dla innych deweloperów było jasne, że metoda nie może być widziana z modelu COM.

Poniższy przykład stosuje do metody ComRegisterFunctionAttribute.

ms182198.collapse_all(pl-pl,VS.110).gifKod

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;
        }
    }
}

Powiązane reguły

CA1017: Znak zespołów o ComVisibleAttribute

CA1406: Uniknąć Int64 argumenty dla klientów programu Visual Basic 6

CA1413: Uniknąć publiczno-pola typów wartości widoczne COM

Zobacz też

Inne zasoby

Współdziałanie z kodu niezarządzanego