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;
}
}
}
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
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per