CA1403: типы макета Auto не должны быть видимыми для COM

Товар Значение
Идентификатор правила CA1403
Категория Microsoft.Interoperability
Критическое изменение Критическое

Причина

Видимый тип значения объектной модели компонента (COM) помечается атрибутом System.Runtime.InteropServices.StructLayoutAttributeSystem.Runtime.InteropServices.LayoutKind.Auto.

Описание правила

LayoutKind Типы макетов управляются средой CLR. Макет этих типов может меняться между версиями .NET, что нарушает com-клиенты, ожидающие определенного макета. StructLayoutAttribute Если атрибут не указан, компиляторы C#, Visual Basic и C++ указывают LayoutKind.Auto для типов значений.

Если не отмечено в противном случае, все общедоступные, не универсальные типы видны COM, а все не общедоступные и универсальные типы невидимы для COM. Однако для уменьшения ложных срабатываний это правило требует явного указания com-видимости типа. Содержащая сборка должна быть помечена набором System.Runtime.InteropServices.ComVisibleAttributefalse , а тип должен быть помечен набором ComVisibleAttributetrue.

Устранение нарушений

Чтобы устранить нарушение этого правила, измените значение StructLayoutAttribute атрибута на LayoutKind.Explicit или LayoutKind.Sequential или невидимый для типа COM.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показан тип, который нарушает правило и тип, удовлетворяющий правилу.

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: не используйте AutoDual ClassInterfaceType

См. также