CA1407: Evitare i membri statici nei tipi visibili a COM

Articolo Valore
ID regola CA1407
Category Microsoft.Interoperability
Modifica Nessuna interruzione

Causa

Un tipo contrassegnato in modo specifico come visibile a COMPONENT Object Model (COM) contiene un public``static metodo.

Descrizione regola

COM non supporta i static metodi.

Questa regola ignora le funzioni di accesso alle proprietà e agli eventi, i metodi di overload degli operatori o i metodi contrassegnati tramite l'attributo System.Runtime.InteropServices.ComRegisterFunctionAttribute o l'attributo System.Runtime.InteropServices.ComUnregisterFunctionAttribute .

Per impostazione predefinita, i seguenti elementi sono visibili a COM: assembly, tipi pubblici, membri di istanze pubbliche nei tipi pubblici e tutti i membri dei tipi di valore pubblico.

Affinché questa regola venga eseguita, è necessario impostare un livello ComVisibleAttribute di assembly su false e la classe - ComVisibleAttribute deve essere impostata 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 usare un metodo di istanza che fornisce la stessa funzionalità del static metodo .

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se un client COM non richiede l'accesso alla funzionalità fornita dal static metodo .

Violazione di esempio

Descrizione

Nell'esempio seguente viene illustrato un static metodo 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 il metodo Book.FromPages non può essere chiamato da COM.

Correzione di esempio

Descrizione

Per correggere la violazione nell'esempio precedente, è possibile modificare il metodo in un metodo di istanza, ma ciò non ha senso in questa istanza. Una soluzione migliore consiste nell'applicare ComVisible(false) in modo esplicito al metodo per rendere chiaro ad altri sviluppatori che il metodo non può essere visto da COM.

L'esempio seguente si applica 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;
        }
    }
}

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

Vedi anche

Interoperabilità con codice non gestito