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;
}
}
Reglas relacionadas
CA1408: No utilizar AutoDual ClassInterfaceType
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de