CA1403:自动布局类型不应对 COM 可见
类型名 |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
类别 |
Microsoft.Interoperability |
是否重大更改 |
是 |
原因
通过将 System.Runtime.InteropServices.StructLayoutAttribute 特性设置为 LayoutKind.Auto 来标记组件对象模型 (COM) 可见的值类型。
规则说明
Auto 布局类型由公共语言运行时来管理。 这些类型的布局因 .NET Framework 的版本不同而不同,这将中断要求特定布局的 COM 客户端。 请注意,如果未指定 StructLayoutAttribute 特性,则 C#、Visual Basic 和 C++ 编译器会为值类型指定 Sequential 布局。
除非另行标记,否则所有公共的非泛型类型都对 COM 可见;所有非公共类型和泛型类型都对 COM 不可见。 但是,为了减少误报,此规则要求显式声明类型的 COM 可见性;包含程序集必须用设置为 false 的 System.Runtime.InteropServices.ComVisibleAttribute 进行标记,类型必须用设置为 true 的 ComVisibleAttribute 进行标记。
如何解决冲突
若要修复与该规则的冲突,请将 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