CA1407: Unikaj statycznych elementów członkowskich w typach widocznych dla modelu 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 ComRegisterFunctionAttribute lub atrybutu 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: Oznacz zestawy za pomocą ComVisibleAttribute
CA1406: Unikaj argumentów Int64 dla klientów programu Visual Basic 6
CA1413: Unikaj pól niepublicznych w typach wartościowych widocznych dla modelu COM