朋友組件是指可以存取另一個組件的內部(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) 類型和成員。 例如,如果 AssemblyB 是 Assembly A 的朋友,而 Assembly C 參考AssemblyB,那麼 Assembly C 無法存取internal
(C#)或Friend
(Visual Basic)類型,這些類型在Assembly A 中。
編譯器會對傳遞給InternalsVisibleToAttribute屬性的「friend 組件」名稱進行一些基本的驗證。 如果 元件 A 將 AssemblyB 宣告為 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) 。