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


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

Обновлен: Ноябрь 2007

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

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

Не используйте AutoDual ClassInterfaceType

См. также

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

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

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

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

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