CA1403: Los tipos de diseño automático no deben ser visibles a través de COM

Elemento Valor
RuleId CA1403
Category Microsoft.Interoperability
Cambio importante Problemático

Causa

Un tipo de valor visible del Modelo de objetos componentes (COM) se marca con el atributo System.Runtime.InteropServices.StructLayoutAttribute establecido en System.Runtime.InteropServices.LayoutKind.Auto.

Descripción de la regla

Common Language Runtime administra los tipos de diseño LayoutKind. El diseño de estos tipos puede cambiar de una versión a otra de .NET, lo que interrumpe a los clientes COM que esperan un diseño concreto. Si no se especifica el atributo StructLayoutAttribute, los compiladores de C#, Visual Basic y C++ especifican LayoutKind.Auto para los tipos de valor.

A menos que se indique lo contrario, todos los tipos públicos y no genéricos son visibles para COM y todos los tipos no públicos y genéricos son invisibles para COM. Sin embargo, para reducir los falsos positivos, esta regla requiere que se indique explícitamente la visibilidad COM del tipo. El ensamblado contenedor debe marcarse con System.Runtime.InteropServices.ComVisibleAttribute establecido en false y el tipo debe marcarse con ComVisibleAttribute establecido en true.

Cómo corregir infracciones

Para corregir una infracción de esta regla, cambie el valor del atributo StructLayoutAttribute a LayoutKind.Explicit o LayoutKind.Sequential, o haga que el tipo sea invisible en COM.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo

En el ejemplo siguiente se muestra un tipo que infringe esta regla y uno que la cumple.

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: No utilizar AutoDual ClassInterfaceType

Consulte también