Freigeben über


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;
   }
}

CA1408: AutoDual ClassInterfaceType nicht verwenden.

Weitere Informationen