Udostępnij za pośrednictwem


CA1403: Typy automatycznego układu nie powinny być widoczne dla modelu COM

TypeName

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

Kategoria

Microsoft.Interoperability

Złamanie zmiany

Złamanie

Przyczyna

Typ wartości widoczne hosta skryptów systemu Windows (COM, Component Object Model) jest oznaczone StructLayoutAttribute atrybut ustawiony na LayoutKind.Auto.

Opis reguły

AutoUkład typy są zarządzane przez aparatu plików wykonywalnych języka wspólnego.Można zmienić układ tych typów, między wersjami.NET Framework, która spowoduje zerwanie klientów modelu COM, które oczekują, że o określonym układzie.Należy zauważyć, że jeśli StructLayoutAttribute atrybut nie jest określony, C#, Visual Basic, i określ kompilatory C++ Sequential układ dla typów wartości.

Chyba że oznaczona w inny sposób publicznych nierodzajowe są widoczne w modelu COM; wszystkie rodzaje niepubliczne i rodzajowy są niewidoczne dla modelu COM.Aby ograniczyć wyniki fałszywie dodatnie, ta reguła wymaga jednak widoczność COM typu należy wyraźnie podać; Zgromadzenie zawierające muszą być oznaczone ComVisibleAttribute ustawiona na false i typu muszą być oznaczone ComVisibleAttribute ustawiona na true.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, zmień wartość StructLayoutAttribute atrybutu do Explicit lub Sequential, lub uczynić niewidocznym typ modelu COM.

Kiedy do pomijania ostrzeżenia

Nie pomijaj ostrzeżenie od tej reguły.

Przykład

Poniższy przykład pokazuje typ, który narusza reguły i typ, który spełnia regułę.

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

Zasady pokrewne

CA1408: Nie używać AutoDual ClassInterfaceType

Zobacz też

Koncepcje

Wprowadzenie interfejsu klasy

Kwalifikowanie typów .NET do międzyoperacyjności

Inne zasoby

Współdziałanie z kodem niezarządzanym