Freigeben über


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

Weitere Ressourcen

Interaktion mit nicht verwaltetem Code