Condividi tramite


CA1407: Evitare i membri statici nei tipi visibili a COM

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

Category

Microsoft.Interoperability

Breaking Change

Non sostanziale

Causa

Un tipo specificatamente contrassegnato come visibile a COM (Component Object Model) contiene un metodo public static.

Descrizione della regola

COM non supporta i metodi static.

Questa regola ignora le funzioni di accesso a proprietà ed eventi, i metodi di overload degli operatori o i metodi contrassegnati con l'attributo System.Runtime.InteropServices.ComRegisterFunctionAttribute o System.Runtime.InteropServices.ComUnregisterFunctionAttribute.

Per impostazione predefinita, i seguenti elementi sono visibili a COM: assembly, tipi pubblici, membri di istanza pubblici in tipi pubblici e tutti i membri di tipi di valore pubblici.

Per il verificarsi di questa regola, è necessario che un oggetto ComVisibleAttribute a livello di assembly sia impostato su false e che l'oggetto ComVisibleAttribute relativo a classe sia impostato su true come illustrato nel codice seguente.

using System;
using System.Runtime.InteropServices; 

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

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare la progettazione in modo da utilizzare un metodo di istanza che fornisca la stessa funzionalità del metodo static.

Esclusione di avvisi

È sicuro escludere un avviso da questa regola se un client COM non deve accedere alla funzionalità fornita dal metodo static.

Esempio di violazione

Oggetto di descrizione

Nell'esempio riportato di seguito viene dichiarato un metodo static che viola questa regola.

Codice

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

Commenti

In questo esempio non è possibile chiamare il metodo Book.FromPages da COM.

Correzione di esempio

Oggetto di descrizione

Per correggere la violazione nell'esempio precedente, è possibile impostare il metodo su un metodo di istanza. In questo caso specifico sarebbe tuttavia inutile. Una soluzione migliore consiste nell'applicare in modo esplicito ComVisible(false) al metodo per spiegare chiaramente agli altri sviluppatori che il metodo non è visibile da COM.

Nell'esempio riportato di seguito viene applicato ComRegisterFunctionAttribute al metodo.

Codice

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

Regole correlate

CA1017: Contrassegnare gli assembly con ComVisibleAttribute

CA1406: Evitare gli argomenti Int64 per i client Visual Basic 6

CA1413: Evitare i campi non pubblici nei tipi valore visibili a COM

Vedere anche

Altre risorse

Interoperabilità con codice non gestito