CA1407: Uniknąć elementy statyczne w typach widoczne COM
TypeName |
AvoidStaticMembersInComVisibleTypes |
CheckId |
CA1407 |
Kategoria |
Microsoft.Interoperability |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ, który jest oznaczony jako widoczny dla Component Object Model (COM) zawiera metodę publicstatic.
Opis reguły
COM nie obsługuje metody static.
Ta reguła ignoruje akcesory właściwości i zdarzeń, metody przeciążające operatory lub metody, które są oznaczone poprzez użycie atrybutu System.Runtime.InteropServices.ComRegisterFunctionAttribute lub atrybutu System.Runtime.InteropServices.ComUnregisterFunctionAttribute.
Domyślnie następujące elementy są widoczne dla COM: zestawy, typy publiczne, publiczne wystąpienia członkowskie w typach publicznych oraz wszystkie elementy członkowskie o publicznych typach wartościowych.
Aby ta reguła wystąpiła, poziom zestawu ComVisibleAttribute musi być ustawiony na false i klasa- ComVisibleAttribute musi być ustawiony na true, jak pokazuje poniższy kod
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class MyClass
{
public static void DoSomething()
{
}
}
}
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy zmienić projekt, tak żeby używał metody wystąpienia, która zapewnia takie same funkcje jak metoda static.
Kiedy pominąć ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli klient COM nie wymaga dostępu do funkcji, dostarczonej przez metodę static.
Przykład naruszenia
Opis
W poniższym przykładzie przedstawiono metodę static, która narusza tą regułę.
Kod
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;
}
}
}
Komentarze
W tym przykładzie metoda Book.FromPages nie może być wywołana z COM.
Przykładowa poprawka
Opis
Aby poprawić naruszenie z poprzedniego przykładu, można zmienić metodę na metodę wystąpienia, ale to nie ma sensu w tym przykładzie.Lepszym rozwiązaniem jest jawne zastosowania ComVisible(false) do metody, aby dla innych deweloperów było jasne, że metoda nie może być widziana z modelu COM.
Poniższy przykład stosuje do metody ComRegisterFunctionAttribute.
Kod
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;
}
}
}
Powiązane reguły
CA1017: Znak zespołów o ComVisibleAttribute
CA1406: Uniknąć Int64 argumenty dla klientów programu Visual Basic 6
CA1413: Uniknąć publiczno-pola typów wartości widoczne COM