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)