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 publicstatic.
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
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
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