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 特性的值更改为 ExplicitSequential,或者使该类型对 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 类型

其他资源

与非托管代码交互操作