CA1403: Typen mit automatischem Layout sollten nicht für COM sichtbar sein.
Element | Wert |
---|---|
RuleId | CA1403 |
Category | Microsoft.Interoperability |
Unterbrechende Änderung | Breaking |
Ursache
Ein sichtbarer COM-Werttyp (Component Object Model) wird mit dem System.Runtime.InteropServices.StructLayoutAttribute-Attribut markiert, das auf System.Runtime.InteropServices.LayoutKind.Auto festgelegt ist.
Regelbeschreibung
LayoutKind-Layouttypen werden von der Common Language Runtime verwaltet. Das Layout dieser Typen kann zwischen den verschiedenen .NET-Versionen abweichen. Dies führt zu Fehlern in COM-Clients, die ein bestimmtes Layout erwarten. Wenn das Attribut StructLayoutAttribute nicht angegeben ist, geben die C#-, Visual Basic- und C++-Compiler LayoutKind.Auto für Werttypen an.
Sofern nicht anders gekennzeichnet, sind alle öffentlichen nicht generischen Typen für COM sichtbar. Alle nicht öffentlichen und generischen Typen sind für COM nicht sichtbar. Zur Verringerung falsch positiver Ergebnisse erfordert diese Regel jedoch, dass die COM-Sichtbarkeit des Typs ausdrücklich angegeben wird. Für die enthaltende Assembly muss System.Runtime.InteropServices.ComVisibleAttribute auf false
festgelegt werden, und für den Typ muss ComVisibleAttribute als true
markiert sein.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie den Wert des Attributs StructLayoutAttribute in LayoutKind.Explicit oder LayoutKind.Sequential, oder machen Sie den Typ für COM unsichtbar.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel
Das folgende Beispiel zeigt einen Typ, der gegen die Regel verstößt, und einen Typ, der der Regel entspricht.
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
// This violates the rule.
[StructLayout(LayoutKind.Auto)]
[ComVisible(true)]
public struct AutoLayout
{
public int ValueOne;
public int ValueTwo;
}
// This satisfies the rule.
[StructLayout(LayoutKind.Explicit)]
[ComVisible(true)]
public struct ExplicitLayout
{
[FieldOffset(0)]
public int ValueOne;
[FieldOffset(4)]
public int ValueTwo;
}
}
Ähnliche Regeln
CA1408: AutoDual ClassInterfaceType nicht verwenden.
Weitere Informationen
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