Sdílet prostřednictvím


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

Název_typu

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

Kategorie

Microsoft.interoperability

Změnit rozdělení

Rozdělení

Příčina

Typ hodnoty viditelné objekt modelu COM (Component) je označeno StructLayoutAttribute atribut nastaven na LayoutKind.Auto.

Popis pravidla

Autotypy rozložení jsou spravovány společného jazykového modulu runtime.Změnit rozložení těchto typů mezi verzemi.NET Framework, který přeruší COM klientů, kteří očekávají specifické rozložení.Pokud StructLayoutAttribute tento atribut není určen, C#, Visual Basic, a určete kompilátory C++ Sequential rozložení pro typy hodnot.

Pokud není označeno jinak, všechny veřejné neobecné typy jsou viditelné pro COM; jsou všechny typy neveřejné a obecný nevidí COM.Však sníží o falešný poplach, toto pravidlo vyžaduje viditelnost COM typu výslovně uvedeny; musí být označeny obsahující sestavení ComVisibleAttribute nastavena na false a typ musí být označeno ComVisibleAttribute nastavena na true.

Jak opravit porušení

Porušení tohoto pravidla vyřešit, změňte hodnotu StructLayoutAttribute k atributu Explicit nebo Sequential, nebo nastavit jako neviditelné typ modelu COM.

Při potlačení upozornění

Nepotlačovat upozornění od tohoto pravidla.

Příklad

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

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

Souvisejících pravidel

CA1408: Nepoužívejte AutoDual ClassInterfaceType

Viz také

Koncepty

Představení rozhraní třídy

Kvalifikace typů .NET pro spolupráci

Další zdroje

Spolupráce s nespravovaným kódem