CA1403: Tipos de layout automático não devem ser visível em COM
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
<strong>Categoria</strong> |
Microsoft.Interoperability |
Alteração significativa |
Quebrando |
Causa
Um tipo de valor visível do modelo de objeto componente (COM) está marcado com o System.Runtime.InteropServices.StructLayoutAttribute atributo definido como LayoutKind.Auto.
Descrição da regra
Autotipos de layout são gerenciados pelo common language runtime. O layout desses tipos pode alterar entre versões do.NET Framework, o que interromperá a clientes COM que esperam um layout específico. Observe que, se a StructLayoutAttribute atributo não for especificado, o C#, Visual Basic, e os compiladores de C++ especificar o Sequential layout para tipos de valor.
A menos que o marcado caso contrário, todos os tipos de não genérico públicos são visíveis COM; todos os tipos de confidenciais e genéricos são invisíveis para COM. No entanto, para reduzir os falsos positivos, esta regra exige a visibilidade de COM do tipo a ser declarado explicitamente; o assembly contendo deve ser marcado com o System.Runtime.InteropServices.ComVisibleAttribute definido como false e o tipo deve ser marcado com o ComVisibleAttribute definido como true.
Como corrigir violações
Para corrigir uma violação desta regra, altere o valor da StructLayoutAttribute atributo para Explicit ou Sequential, ou fazer com que o tipo invisível em COM.
Quando suprimir avisos
Não suprimir um aviso da regra.
Exemplo
O exemplo a seguir mostra um tipo que viola a regra e um tipo que satisfaça a regra.
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;
}
}
Regras relacionadas
CA1408: Não use ClassInterfaceType de AutoDual
Consulte também
Conceitos
Apresentando a Interface de classe
Qualificação.NET tipos de interoperação