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 |
Sí |
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