CA1403: Typy automatického rozložení by neměly být viditelné modelu COM

Zboží Hodnota
RuleId CA1403
Kategorie Microsoft.Interoperability
Změna způsobující chybu Narušující

Příčina

Viditelný typ hodnoty modelu COM (Component Object Model) je označen atributem nastaveným System.Runtime.InteropServices.StructLayoutAttribute na System.Runtime.InteropServices.LayoutKind.Auto.

Popis pravidla

LayoutKind Typy rozložení se spravují modulem CLR (Common Language Runtime). Rozložení těchto typů se může změnit mezi verzemi rozhraní .NET, což přeruší klienty MODELU COM, kteří očekávají určité rozložení. StructLayoutAttribute Pokud atribut není zadaný, kompilátory jazyka C#, Visual Basic a C++ pro typy hodnot určují LayoutKind.Auto.

Pokud není označeno jinak, všechny veřejné, ne generické typy jsou viditelné pro objekt COM a všechny neveřejné a obecné typy jsou pro com neviditelné. Aby se však snížil počet falešně pozitivních výsledků, vyžaduje toto pravidlo, aby byla explicitně uvedena viditelnost modelu COM typu. Obsahující sestavení musí být označeno nastavenou System.Runtime.InteropServices.ComVisibleAttribute sadou false a typ musí být označen nastaveným parametrem ComVisibleAttributetrue.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, změňte hodnotu atributu StructLayoutAttribute na LayoutKind.Explicit nebo LayoutKind.Sekvenční, nebo typ neviditelný pro com.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje typ, který porušuje pravidlo, a typ, který pravidlo splňuje.

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;
   }
}

CA1408: Nepoužívejte AutoDual ClassInterfaceType

Viz také