Compartir a través de


CA1403: Los tipos de diseño automático no deben ser visibles para COM

Nombre de tipo

AutoLayoutTypesShouldNotBeComVisible

Identificador de comprobación

CA1403

Categoría

Microsoft.Interoperability

Cambio problemático

Motivo

Un tipo de valor visible para el Modelo de objetos componentes (COM) está marcado con el atributo System.Runtime.InteropServices.StructLayoutAttribute establecido en LayoutKind.Auto.

Descripción de la regla

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

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

Cómo corregir infracciones

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

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

El ejemplo siguiente muestra un tipo que infringe la regla y otro que la cumple.

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

Reglas relacionadas

CA1408: No utilizar AutoDual ClassInterfaceType

Vea también

Conceptos

Presentar la interfaz de clase

Habilitar tipos de .NET para la interoperación

Otros recursos

Interoperar con código no administrado