Freigeben über


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

Weitere Ressourcen

Interoperation mit nicht verwaltetem Code