Sdílet prostřednictvím


CA1407: Vyhnout se statickým členům v viditelné typy modelu COM

Název_typu

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

Kategorie

Microsoft.interoperability

Změnit rozdělení

Bez rozdělení

Příčina

Obsahuje typ, který je výslovně označen jako viditelný na modelu COM (Component Object) publicstatic metoda.

Popis pravidla

COM nepodporuje static metod.

Toto pravidlo ignoruje vlastnost a událost přístupové objekty, přetížení metod nebo metod, které jsou označeny buď pomocí operátoru System.Runtime.InteropServices.ComRegisterFunctionAttribute atributu nebo System.Runtime.InteropServices.ComUnregisterFunctionAttribute atributu.

Standardně jsou viditelné pro COM: sestavení, veřejné typy, členy veřejné instance ve veřejné typy a všechny členy veřejné hodnoty typů.

Toto pravidlo dojít k sestavení úrovně ComVisibleAttribute musí být nastavena na false a třída - ComVisibleAttribute musí být nastavena na true, jak ukazuje následující kód.

using System;
using System.Runtime.InteropServices; 

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

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla změnit návrh metoda instance, který poskytuje stejné funkce jako static metoda.

Při potlačení upozornění

Je bezpečné potlačí upozornění od tohoto pravidla, pokud klient COM nevyžaduje přístup k funkcím, které poskytuje static metoda.

Příklad narušení

ms182198.collapse_all(cs-cz,VS.110).gifDescription

Následující příklad ukazuje static metoda, která toto pravidlo porušují.

ms182198.collapse_all(cs-cz,VS.110).gifKód

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(cs-cz,VS.110).gifKomentáře

V tomto příkladu Book.FromPages nelze volat metodu z modelu COM.

Například oprava

ms182198.collapse_all(cs-cz,VS.110).gifDescription

Vyřešit narušení v předchozím příkladu, nelze změnit metodu metodu instance, ale která nemá smysl v této instanci.Lepším řešením je použít explicitně ComVisible(false) metody tak, aby jej vymazat vývojáři metodu nelze pohlížet z modelu COM.

Následující příklad se vztahuje ComRegisterFunctionAttribute metodou.

ms182198.collapse_all(cs-cz,VS.110).gifKód

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

Souvisejících pravidel

CA1017: Značka sestav s ComVisibleAttribute

CA1406: Vyhnout Int64 argumenty pro klienty Visual Basic 6

CA1413: Nepoužívejte neveřejné pole zobrazena hodnota typů COM

Viz také

Další zdroje

Spolupráce s nespravovaným kódem.