更新:2007 年 11 月
| TypeName | AutoLayoutTypesShouldNotBeComVisible | 
| CheckId | CA1403 | 
| 类别 | Microsoft.Interoperability | 
| 是否重大更改 | 是 | 
原因
COM 可见的值类型标记有设置为 LayoutKind.Auto 的 System.Runtime.InteropServices.StructLayoutAttribute 属性。
规则说明
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;
   }
}
相关规则
不要使用 AutoDual ClassInterfaceType