Partilhar via


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

Outros recursos

Interoperação com código não gerenciado