Friend 組件 (C# 和 Visual Basic)

「Friend 組件」(Friend Assembly) 是一種組件,它可以存取另一個組件的 Friend (Visual Basic) 或 internal (C#) 型別和成員。 如果將組件識別為 Friend 組件,就不再需要將型別和成員標記為 public 供其他組件存取。 這在下列案例中尤其方便:

  • 在單元測試期間,測試程式碼在另一個組件中執行,但是需要存取所測試組件中的成員,此時可以將該成員標記為 Friend (Visual Basic) 或 internal (C#)。

  • 您在開發類別庫時,類別庫的附加功能包含在不同組件中,且需要存取現有組件中的成員,此時可以將該成員標記為 Friend (Visual Basic) 或 internal (C#)。

備註

您可以使用 InternalsVisibleToAttribute 屬性 (Attribute),為特定組件指定一個或多個 Friend 組件。 下列範例在組件 A 中使用 InternalsVisibleToAttribute 屬性,並指定組件 AssemblyB 為 Friend 組件。 這樣可讓組件 AssemblyB 存取組件 A 中所有標記為 Friend (Visual Basic) 或 internal (C#) 的型別和成員。

注意事項注意事項

當您針對會存取另一個組件 (組件 A) 的內部型別或內部成員的組件 (組件 AssemblyB) 進行編譯時,您必須使用 /out 編譯器選項,明確指定輸出檔 (.exe 或 .dll) 的名稱。 這是需要的,因為當編譯器繫結至外部參考時,它尚未替正在建立的組件產生名稱。 如需詳細資訊,請參閱 /out (C#)/out (Visual Basic)

Imports System.Runtime.CompilerServices
Imports System
<Assembly: InternalsVisibleTo("AssemblyB")> 

' Friend class.
Friend Class FriendClass
    Public Sub Test()
        Console.WriteLine("Sample Class")
    End Sub
End Class

' Public class with a Friend method.
Public Class ClassWithFriendMethod
    Friend Sub Test()
        Console.WriteLine("Sample Method")
    End Sub
End Class
using System.Runtime.CompilerServices;
using System;

[assembly: InternalsVisibleTo("AssemblyB")]

// The class is internal by default.
class FriendClass
{
    public void Test()
    {
        Console.WriteLine("Sample Class");
    }
}

// Public class that has an internal method.
public class ClassWithFriendMethod
{
    internal void Test()
    {
        Console.WriteLine("Sample Method");
    }

}

只有明確指定為 friend 的組件才能存取 Friend (Visual Basic) 或 internal (C#) 型別和成員。 例如,如果組件 B 是組件 A 的 friend,而組件 C 參考了組件 B,則 C 無法存取 A 中的 Friend (Visual Basic) 或 internal (C#) 型別。

編譯器 (Compiler) 會對傳遞給 InternalsVisibleToAttribute 屬性的 Friend 組件名稱執行一些基本的驗證。 如果組件 A 將 B 宣告為 Friend 組件,則驗證規則如下:

  • 如果組件 A 具有強式名稱,則組件 B 也必須具有強式名稱。 傳遞給這個屬性的 Friend 組件名稱必須包含組件名稱,以及指派組件 B 時所用強式名稱金鑰的公開金鑰 (Public Key)。

    傳遞給 InternalsVisibleToAttribute 屬性的 Friend 組件名稱不能是組件 B 的強式名稱,意即請不要包含組件版本、文化特性 (Culture)、架構或公開金鑰語彙基元 (Token)。

  • 如果組件 A 不具強式名稱,則 Friend 組件名稱只應包含組件名稱。 如需詳細資訊,請參閱 HOW TO:建立未簽署的 Friend 組件 (C# 和 Visual Basic)

  • 如果組件 B 具有強式名稱,則您必須使用專案設定或命令列的 /keyfile 編譯器選項,為組件 B 指定強式名稱金鑰。 如需詳細資訊,請參閱 HOW TO:建立已簽署的 Friend 組件 (C# 和 Visual Basic)

StrongNameIdentityPermission 類別也提供共用型別的功能,但兩者差異如下:

  • StrongNameIdentityPermission 適用於個別型別,而 friend 組件適用整個組件。

  • 如果要將組件 A 中數百個型別與組件 B 共用,必須將 StrongNameIdentityPermission 加入至所有這些型別。 但如果使用 Friend 組件,則僅需宣告一次 friend 關聯性。

  • 如果使用 StrongNameIdentityPermission,您要共用的型別必須宣告為公用。 如果使用 friend 組件,共用的型別會宣告為 Friend (Visual Basic) 或 internal (C#)。

如需如何從模組檔案 (副檔名為 .netmodule 的檔案) 存取組件之 Friend (Visual Basic) 或 internal (C#) 型別和方法的詳細資訊, 請參閱 /moduleassemblyname (Visual Basic)/moduleassemblyname (C#)

請參閱

工作

HOW TO:建立未簽署的 Friend 組件 (C# 和 Visual Basic)

HOW TO:建立已簽署的 Friend 組件 (C# 和 Visual Basic)

參考

InternalsVisibleToAttribute

StrongNameIdentityPermission

概念

組件和全域組件快取 (C# 和 Visual Basic)

C# 程式設計手冊

其他資源

Visual Basic 程式設計手冊