CA1403: os tipos de layout automático não devem ser visíveis em COM
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
Categoria |
Microsoft.Interoperability |
Alteração Significativa |
Quebra |
Causa
Um tipo de valor visível do Component Object Model (COM) é marcado com o atributo de StructLayoutAttribute definido como LayoutKind.Auto.
Descrição da Regra
os tipos de layout deAuto são gerenciados por Common Language Runtime.O layout deless podem ser alterados entre versões do.NET Framework, que interromperão clientes COM que esperam por um layout específico.Observe que se o atributo de StructLayoutAttribute não for especificado, o C#, Visual Basic, e os compiladores C++ especificam o layout de Sequential para tipos de valor.
A menos que marcados de outra forma, todos os tipos públicos não são visíveis à; todos os tipos genéricos público e são invisíveis COM.No entanto, para reduzir falsos positivos, essa regra requer a visibilidade de COM o tipo ser declarado explicitamente; o assembly contentor deve ser marcado com ComVisibleAttribute definido como false e o tipo deve ser marcado com ComVisibleAttribute definido como true.
Como Corrigir Violações
Para corrigir uma violação desta regra, altere o valor do atributo de StructLayoutAttribute a Explicit ou a Sequential, ou fazer o tipo invisível COM.
Quando Suprimir Alertas
Não elimine um alerta desta 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 usar AutoDual ClassInterfaceType
Consulte também
Conceitos
Introdução à interface de classe
Qualificando tipos do .NET para interoperação