Compartir a través de


Los tipos de diseño automático no deben ser COMVisible

Actualización: noviembre 2007

     TypeName

AutoLayoutTypesShouldNotBeComVisible

Identificador de comprobación

CA1403

Category

Microsoft.Interoperability

Cambio problemático

Motivo

Un tipo visible para 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

No utilice 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