共用方式為


CA1403:自動配置類型不應該是 COM 可見

型別名稱

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

分類

Microsoft.Interoperability

中斷變更

中斷

原因

元件物件模型 (COM) 可見的實值型別是以設定為 LayoutKind.AutoStructLayoutAttribute 屬性所標記。

規則描述

Auto 配置型別是由 Common Language Runtime 所管理。可以在 .NET Framework 的版本間變更這些型別的配置,這將會中斷必須有特定配置的 COM 用戶端。請注意如果未指定 StructLayoutAttribute 屬性,則 C#、Visual Basic 和 C++ 編譯器會指定實值型別的 Sequential 配置。

除非已標記,否則所有公用的非泛型型別對 COM 皆為可見的,而所有非公用的泛型型別對 COM 則皆不可見的。但是,為了減少誤報的情形,這項規則要求必須明確陳述此型別的 COM 可視性、必須使用設定為 false 的 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 類型

其他資源

與 Unmanaged 程式碼互通