Partilhar via


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

Outros recursos

Interoperação com Código Não Gerenciado