分享方式:


System.Runtime.CompilerServices.InternalsVisibleToAttribute 類別

本文提供此 API 參考文件的補充備註。

屬性 InternalsVisibleToAttribute 會指定只有目前元件內通常可見的類型才會顯示在指定的元件中。

一般而言,在 C# 中具有 internal 範圍的類型和成員,或 在 Visual Basic 中具有 Friend 範圍的類型和成員,通常只有在定義它們的組件中才可見。 具有 protected internal 範圍的類型和成員(Protected Friend Visual Basic 中的範圍)只能在自己的元件中顯示,或是衍生自其包含類別的類型。 在當前程式集中,具有 private protected 範圍的類型和成員(在Visual Basic中為 Private Protected 範圍)只能在包含類別或從其包含類別衍生出的類型中可見。

屬性 InternalsVisibleToAttribute 使這些類型和成員對指定元件中的型別和成員可見,這稱為朋友組件。 這僅適用於 internal(在 Visual Basic 中為 Friend)、protected internal(在 Visual Basic 中為 Protected Friend)以及 private protected(在 Visual Basic 中為 Private Protected)成員,但不適用於 private

備註

private protected(Visual Basic 中的 Private Protected)成員中,InternalsVisibleToAttribute 屬性只會將可存取性延伸至衍生自會員的 包含類別 的型別。

屬性會在元件層級套用。 這表示它可以包含在原始程式碼檔的開頭,也可以包含在Visual Studio專案中的AssemblyInfo檔案中。 您可以使用屬性來指定一個能存取目前元件內部類型和成員的單一好友元件。 您可以透過兩種方式定義多個Friend元件。 這些屬性可以顯示為個別元件層級屬性,如下列範例所示。

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>

它們可以透過分別的 InternalsVisibleToAttribute 標籤顯示,但有一個 assembly 單一關鍵詞,如下例所示。

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
 Assembly:InternalsVisibleTo("Friend2b")>

friend 組件是由 InternalsVisibleToAttribute 建構函式所識別。 目前的元件和伙伴元件都必須未簽署,或兩個元件都必須以強名稱簽署。

如果這兩個元件都是未簽署的,那麼 assemblyName 參數包含友元元件的名稱,不指定目錄路徑或檔案名稱副檔名。

如果這兩個元件都以強名稱簽署,則建構函式的自變數 InternalsVisibleToAttribute 必須包含元件的名稱,不含其目錄路徑或擴展名,以及完整的公鑰(而非其公鑰令牌)。 若要取得強名稱元件的完整公鑰,請參閱本文稍後 的取得完整公鑰 一節。 若要瞭解如何使用InternalsVisibleToAttribute搭配強名稱元件,請參閱InternalsVisibleToAttribute建構函式。

請勿在 自變數中包含、 CultureInfoVersion 字段的值ProcessorArchitecture;Visual Basic、C# 和 C++ 編譯程式會將此值視為編譯程式錯誤。 如果您使用的編譯程式不將它視為錯誤(例如 IL 組譯工具(ILAsm.exe)),而且組件具有強名稱,則第一次指定的 friend 組件存取包含 MethodAccessException 屬性的組件時,就會擲回例外狀況。

如需如何使用此屬性的詳細資訊,請參閱 Friend 元件C++ friend 元件

取得完整的公鑰

您可以使用 強名稱工具 (Sn.exe) 從強名稱金鑰 (.snk) 檔案擷取完整的公鑰。 若要這樣做,請執行下列步驟:

  1. 將公鑰從強名稱金鑰檔案擷取至個別的檔案:

    Sn -p <snk_file> <outfile>

  2. 向主控台顯示完整的公鑰:

    Sn -tp <outfile>

  3. 將完整的公鑰值複製並貼到您的原始程式碼中。

使用 C# 編譯 friend 組件

如果您使用 C# 編譯程式來編譯 friend 元件,則必須使用 /out 編譯程式選項明確指定輸出檔的名稱(.exe 或 .dll)。 這是必要的,因為編譯程式尚未產生它在系結至外部參考時所建置之元件的名稱。 /out 編譯程式選項是 Visual Basic 編譯程式的選擇性選項,而使用 F# 編譯程式編譯 friend 元件時,不應該使用對應的 -out-o 編譯程式選項。

使用 C++ 編譯 朋友程序集

在C++中,若要讓由 InternalsVisibleToAttribute 屬性啟用的內部成員可以讓friend組件存取,您必須在C++指示詞中使用 as_friend 屬性。 如需詳細資訊,請參閱 Friend 程序集(C++)。