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 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 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é