CA1403: Los tipos de diseño automático no deben ser visibles para COM
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
Identificador de comprobación |
CA1403 |
Categoría |
Microsoft.Interoperability |
Cambio problemático |
Problemático |
Motivo
Un tipo de valor visible para el Modelo de objetos componentes (COM) está marcado con el atributo 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 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