Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Aktualisiert: November 2007
TypeName |
AvoidStaticMembersInComVisibleTypes |
CheckId |
CA1407 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
NonBreaking |
Ursache
Ein Typ, der ausdrücklich als für COM sichtbar markiert ist, enthält eine publicstatic-Methode.
Regelbeschreibung
COM unterstützt keine static-Methoden.
Bei der Überprüfung dieser Regel werden Eigenschaften- und Ereignisaccessoren, Methoden für Operatorüberladungen oder mit dem System.Runtime.InteropServices.ComRegisterFunctionAttribute-Attribut oder dem System.Runtime.InteropServices.ComUnregisterFunctionAttribute-Attribut markierte Methoden ignoriert.
Standardmäßig sind folgende Programmierelemente für COM sichtbar: Assemblys, öffentliche Typen, öffentliche Instanzmember in öffentlichen Typen und alle Member öffentlicher Werttypen.
Damit diese Regel ausgelöst wird, müssen ein ComRegisterFunctionAttribute auf Assemblyebene auf false und das ComRegisterFunctionAttribute auf Klassenebene auf true festgelegt werden. Siehe dazu folgendes Codebeispiel:
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class MyClass
{
public static void DoSomething()
{
}
}
}
Behandlung von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie das Design dahingehend, dass eine Instanzenmethode verwendet wird, die die gleiche Funktionalität wie die static-Methode bereitstellt.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn ein COM-Client nicht auf die von der static-Methode bereitgestellte Funktionalität zugreifen muss.
Beispiel für einen Verstoß
Beschreibung
Im folgenden Beispiel wird eine static-Methode veranschaulicht, die gegen diese Regel verstößt.
Code
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;
}
}
}
Kommentare
Im folgenden Beispiel kann die Book.FromPages-Methode nicht aus COM aufgerufen werden.
Beispiel für die Behandlung
Beschreibung
Um den Verstoß im vorigen Beispiel zu behandeln, könnten Sie die Methode in eine Instanzenmethode ändern, was in diesem Fall jedoch keinen Sinn ergibt. Eine bessere Lösung besteht darin, ComVisible(false) explizit auf die Methode anzuwenden, um anderen Entwicklern gegenüber zu verdeutlichen, dass die Methode nicht aus COM angezeigt werden kann.
Im folgenden Beispiel wird ComRegisterFunctionAttribute auf die Methode angewendet.
Code
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;
}
}
}
Verwandte Regeln
Markieren von Assemblys mit dem ComVisible-Attribut
Vermeiden von Int64-Argumenten für Visual Basic 6-Clients
Vermeiden von nicht öffentlichen Feldern in ComVisible-Werttypen