CA1403: типы макета Auto не должны быть видимыми для COM
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
Категория |
Microsoft.Interoperability |
Критическое изменение |
Критическое изменение |
Причина
Видимый для COM тип значения помечен атрибутом StructLayoutAttribute со значением LayoutKind.Auto.
Описание правила
Типы макета Auto управляются средой CLR.Макеты этих типов могут меняться в различных версиях платформы .NET Framework, что может привести к нарушению работы клиентов COM, которые ожидают определенного макета.Обратите внимание, что, если атрибут StructLayoutAttribute не указан, компиляторы C#, Visual Basic и C++ указывают для типов значения макет Sequential.
Если не указано иное, все открытые и не универсальные типы являются видимыми для COM; все не открытые и универсальные типы являются невидимыми для COM.Однако чтобы снизить количество ложных положительных результатов, данное правило требует явно указывать видимость типа для COM; содержащая тип сборка должна быть помечена атрибутом 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 для взаимодействия