Partager via


CA1403 : Les types Structurer automatiquement ne doivent pas être visibles par COM

TypeName

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

Catégorie

Microsoft.Interoperability

Modification avec rupture

Oui

Cause

Un type de valeur COM (Component Object Model) visible est marqué avec l'attribut System.Runtime.InteropServices.StructLayoutAttribute défini sur la valeur LayoutKind.Auto.

Description de la règle

Les types de disposition Auto sont gérés par le Common Language Runtime. La disposition de ces types peut varier suivant les versions du .NET Framework, ce qui bloque les clients COM qui attendent une disposition spécifique. Notez que si l'attribut StructLayoutAttribute n'est pas spécifié, les compilateurs C#, Visual Basic et C++ spécifient la disposition Sequential pour les types valeur.

Sauf s'ils sont marqués autrement, tous les types publics et non génériques sont visibles dans COM ; tous les types non publics et génériques ne sont pas visibles dans COM. Toutefois, pour limiter les faux positifs, cette règle requiert que la visibilité COM du type soit déclarée explicitement ; l'assembly contenant doit être marqué avec System.Runtime.InteropServices.ComVisibleAttribute ayant la valeur false et le type doit être marqué avec ComVisibleAttribute ayant la valeur true.

Comment corriger les violations

Pour corriger une violation de cette règle, remplacez la valeur de l'attribut StructLayoutAttribute par Explicit ou Sequential, ou faites en sorte que le type soit invisible dans COM.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L'exemple suivant présente un type qui viole la règle et un autre qui satisfait la règle.

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

Règles connexes

CA1408 : Ne pas utiliser le paramètre AutoDual ClassInterfaceType

Voir aussi

Concepts

Présentation de l'interface de classe

Qualification des types .NET en vue d'une interopérabilité

Autres ressources

Interopération avec du code non managé