Типы макета 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 для взаимодействия