Поделиться через


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

TypeName

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

Категория

Microsoft.Interoperability

Критическое изменение

Критическое изменение

Причина

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

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

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

Если не указано иное, все открытые и не универсальные типы являются видимыми для COM; все не открытые и универсальные типы являются невидимыми для COM.Однако чтобы снизить количество ложных положительных результатов, данное правило требует явно указывать видимость типа для COM; содержащая тип сборка должна быть помечена атрибутом System.Runtime.InteropServices.ComVisibleAttribute, для которого установлено значение false, а тип необходимо пометить атрибутом ComVisibleAttribute со значением true.

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

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

Отключение предупреждений

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

Пример

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

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

Связанные правила

CA1408: не используйте AutoDual ClassInterfaceType

См. также

Основные понятия

Введение в интерфейс класса

Уточнение типов .NET для взаимодействия

Другие ресурсы

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