Sdílet prostřednictvím


CA1407: Vyhněte se statickým členům ve viditelných typech 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 ComRegisterFunctionAttribute atributu nebo 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í

Description

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

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

Komentáře

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

Například oprava

Description

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.

Kó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: Označte sestavení pomocí atributu ComVisibleAttribute

CA1406: Vyhněte se argumentům Int64 pro klienty jazyka Visual Basic 6

CA1413: Vyhněte se neveřejným polím v hodnotách viditelných modulem COM

Viz také

Další zdroje

Spolupráce s nespravovaným kódem