Typen mit automatischem Layout sollten nicht COM sichtbar sein
Aktualisiert: November 2007
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
Breaking |
Ursache
Ein für COM sichtbarer Werttyp wird mit dem auf LayoutKind.Auto festgelegten System.Runtime.InteropServices.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 System.Runtime.InteropServices.ComVisibleAttribute-Attribut markiert sein, und der Typ muss mit dem auf true festgelegten ComVisibleAttribute-Attribut markiert sein.
Behandlung 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
AutoDual ClassInterfaceType nicht verwenden
Siehe auch
Konzepte
Einführung in die Klassenschnittstelle
Qualifizieren von .NET-Typen für die Interoperation