CA1403: Typen mit automatischem Layout sollten nicht für COM sichtbar sein
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
Kategorie (Category) |
Microsoft.Interoperability |
Unterbrechende Änderung |
Breaking |
Ursache
Ein sichtbarer Component Object Model (COM)-Werttyp wird mit dem auf LayoutKind.Auto festgelegten StructLayoutAttribute-Attribut markiert.
Regelbeschreibung
Auto-Layouttypen werden von der Common Language Runtime verwaltet.Das Layout dieser Typen kann zwischen den verschiedenen .NET Framework-Versionen voneinander abweichen, wodurch die Verbindung zu COM-Clients unterbrochen wird, die ein bestimmtes Layout erwarten.Wenn das StructLayoutAttribute-Attribut nicht angegeben ist, legen der C#-, der Visual Basic- und der C++-Compiler das Sequential-Layout für Werttypen fest.
Sofern nicht anders markiert, sind alle öffentlichen, nicht generischen Typen für COM sichtbar; alle nicht öffentlichen, generischen Typen sind für COM nicht sichtbar.Um jedoch die Anzahl falscher positiver Ergebnisse zu verringern, muss entsprechend der Regel die COM-Sichtbarkeit des Typs explizit angegeben werden, die enthaltende Assembly muss mit dem auf false festgelegten ComVisibleAttribute-Attribut markiert sein, und der Typ muss mit dem auf true festgelegten ComVisibleAttribute-Attribut markiert sein.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie den Wert des StructLayoutAttribute-Attributs in Explicit oder 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.
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary
' This violates the rule.
<StructLayoutAttribute(LayoutKind.Auto)> _
<ComVisibleAttribute(True)> _
Public Structure AutoLayout
Dim ValueOne As Integer
Dim ValueTwo As Integer
End Structure
' This satisfies the rule.
<StructLayoutAttribute(LayoutKind.Explicit)> _
<ComVisibleAttribute(True)> _
Public Structure ExplicitLayout
<FieldOffsetAttribute(0)> _
Dim ValueOne As Integer
<FieldOffsetAttribute(4)> _
Dim ValueTwo As Integer
End Structure
End Namespace
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;
}
}
Verwandte Regeln
CA1408: AutoDual ClassInterfaceType nicht verwenden
Siehe auch
Konzepte
Einführung in die Klassenschnittstelle
Qualifizieren von .NET-Typen für die Interoperation