共用方式為


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

型別名稱

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

分類

Microsoft.Interoperability

中斷變更

中斷

原因

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

規則描述

Auto 配置型別是由 Common Language Runtime 所管理。 可以在 .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 型別

其他資源

與 Unmanaged 程式碼互通