共用方式為


Friend 組件

朋友組件是指可以存取另一個組件的內部(C#)或Friend(Visual Basic)類型和成員的組件。 如果您將元件屬性新增至 AssemblyA ,將 AssemblyB 識別為 friend 元件,您就不再需要將 AssemblyA 中的類型和成員標示為公用,以便 AssemblyB 存取它們。 在下列案例中,這特別方便:

  • 在單元測試期間,當測試代碼在個別元件中執行,但需要存取在所測試的元件中的成員,這些成員在 C# 中被標示為 internal 或在 Visual Basic 中被標示為 Friend

  • 當您開發類別庫時,新增項目會包含在不同的組件中,但如需存取 C# 中標示為 internal 或 Visual Basic 中標示為 Friend 的現有組件中的成員時,需取得許可。

備註

您可以使用 InternalsVisibleToAttribute 屬性來識別指定元件的一或多個朋友組件。 下列範例使用 InternalsVisibleToAttribute 中的 屬性,並將 AssemblyB 指定為 friend 元件。 這可讓元件 AssemblyB 存取 元件 A 中標示為 internal C# 或 Friend Visual Basic 中的所有類型和成員。

備註

當您編譯元件,例如 AssemblyB,並且該元件將存取另一個元件,例如 AssemblyA 的內部類型或內部成員時,必須使用 -out 編譯器選項明確指定輸出檔的名稱(.exe.dll)。 這是必要的,因為編譯程式尚未產生它在系結至外部參考時所建置之元件的名稱。 如需詳細資訊,請參閱 OutputAssembly (C#)-out (Visual Basic)

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");
    }

}
Imports System.Runtime.CompilerServices
<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

只有您明確指定為朋友的元件可以存取 internal (C#) 或 Friend (Visual Basic) 類型和成員。 例如,如果 AssemblyBAssembly A 的朋友,而 Assembly C 參考AssemblyB,那麼 Assembly C 無法存取internal(C#)或Friend(Visual Basic)類型,這些類型在Assembly A 中。

編譯器會對傳遞給InternalsVisibleToAttribute屬性的「friend 組件」名稱進行一些基本的驗證。 如果 元件 AAssemblyB 宣告為 friend 元件,驗證規則如下所示:

  • 如果 元件 A 為強名稱, AssemblyB 也必須是強名稱。 傳遞至屬性的友元組件名稱必須包含組件名稱以及用來簽署 AssemblyB 的強名稱金鑰的公鑰。

    傳遞給 InternalsVisibleToAttribute 屬性的 friend 元件名稱不得是 AssemblyB 的強名稱。 請勿包含元件版本、文化特性、架構或公鑰令牌。

  • 如果元件 A沒有以強式命名,則友元件名稱應該只包含元件名稱。 如需進一步了解,請參閱 如何:建立未簽名的朋友組件

  • 如果 AssemblyB 為強名稱,您必須使用項目設定或命令行編譯程式選項來指定 /keyfile 的強名稱索引鍵。 如需詳細資訊,請參閱 如何:建立已簽署的朋友元件

類別 StrongNameIdentityPermission 也提供共用類型的能力,但有下列差異:

  • StrongNameIdentityPermission 適用於個別類型,而友元組件則適用於整個組件。

  • 如果Assembly A 中有數百種類型需要與 AssemblyB 共用,則必須將 StrongNameIdentityPermission 新增至所有類型。 如果您使用朋友元件,您只需要宣告朋友關係一次。

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

如需如何從模組檔案存取元件 internal (C#) 或 Friend (Visual Basic) 類型和方法的相關信息(擴展名為 .netmodule 的檔案),請參閱 ModuleAssemblyName (C#)-moduleassemblyname (Visual Basic)

另請參閱