CA1407: Statische Member in für COM sichtbaren Typen vermeiden.
Element | Wert |
---|---|
RuleId | CA1407 |
Category | Microsoft.Interoperability |
Unterbrechende Änderung | Nicht unterbrechend |
Ursache
Ein Typ, der speziell als für das Component Object Model (COM) sichtbar gekennzeichnet ist, enthält eine als public``static
markierte Methode.
Regelbeschreibung
COM unterstützt static
keine Methoden.
Diese Regel ignoriert Zugriffsmethoden für Eigenschaften und Ereignisse, Überladungsmethoden für Operatoren oder Methoden, die entweder mit dem System.Runtime.InteropServices.ComRegisterFunctionAttribute-Attribut oder dem System.Runtime.InteropServices.ComUnregisterFunctionAttribute-Attribut gekennzeichnet sind.
Standardmäßig sind für COM folgende Elemente sichtbar: Assemblys, öffentliche Typen, Member öffentlicher Instanzen in öffentlichen Typen und alle Member von öffentlichen Werttypen.
Damit diese Regel eintritt, muss ein ComVisibleAttribute auf Assemblyebene auf false
und die Klasse ComVisibleAttribute auf true
festgelegt sein, wie im folgenden Code gezeigt.
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace Samples
{
[ComVisible(true)]
public class MyClass
{
public static void DoSomething()
{
}
}
}
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie den Entwurf so ab, dass eine Instanzmethode verwendet wird, die die gleiche Funktionalität bietet wie die Methode static
.
Wann sollten Warnungen unterdrückt werden?
Es ist sicher, eine Warnung von dieser Regel zu unterdrücken, wenn ein COM-Client keinen Zugriff auf die Funktionalität benötigt, die von der static
Methode bereitgestellt wird.
Beispiel für einen Verstoß
BESCHREIBUNG
Das folgende Beispiel zeigt eine static
-Methode, 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
In diesem Beispiel kann die Book.FromPages-Methode nicht von COM aufgerufen werden.
Beispiel für eine Korrektur
BESCHREIBUNG
Zum Beheben des Verstoßes im vorherigen Beispiel könnten Sie die Methode in eine Instanzmethode umwandeln, was in diesem Fall jedoch nicht sinnvoll ist. Eine bessere Lösung besteht darin, explizit auf die Methode anzuwenden ComVisible(false)
, um anderen Entwicklern deutlich zu machen, dass die Methode nicht von COM gesehen werden kann.
Das folgende Beispiel wendet ComVisibleAttribute auf die Methode an.
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;
}
}
}
Ähnliche Regeln
CA1017: Assemblys mit ComVisibleAttribute markieren.
CA1406: Int64-Argumente für Visual Basic 6-Clients vermeiden.
CA1413: Nicht öffentliche Felder in für COM sichtbaren Werttypen vermeiden.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für