訓練
Friend 組件
friend 元件是可以存取另一個元件的內部 (C#) 或 Friend (Visual Basic) 類型和成員的元件。 如果您將元件屬性新增至 AssemblyA,將 AssemblyB 識別為 friend 元件,您就不再需要將 AssemblyA 中的類型和成員標示為公用,以便 AssemblyB 存取它們。 這在下列情況下特別方便:
在單元測試期間,當測試程式碼在另一個組件中執行,但需要存取所測試組件中標記為
internal
(C#) 或Friend
(Visual Basic) 的成員時。當您要開發類別庫且類別庫的新增項目包含在不同的組件,但需要存取現有組件中標記為
internal
(C#) 或Friend
(Visual Basic) 的成員時。
您可以使用 InternalsVisibleToAttribute 屬性找出指定組件的一或多個 Friend 組件。 下列範例使用 InternalsVisibleToAttribute AssemblyA 中的 屬性,並將 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 的 friend 參考 AssemblyB,則元件 C 無法存取internal
元件 A 中的 (C#) 或 Friend
[Visual Basic] 類型。
編譯器會執行一些被傳遞給 InternalsVisibleToAttribute 屬性的 Friend 組件名稱的基本驗證。 如果 元件 A 將 AssemblyB 宣告為 friend 元件,驗證規則如下所示:
如果 元件 A 為強名稱, AssemblyB 也必須是強名稱。 傳遞至 屬性的friend元件名稱必須包含元件名稱和用來簽署 AssemblyB 的強名稱索引鍵的公鑰。
傳遞給 InternalsVisibleToAttribute 屬性的 friend 元件名稱不能是 AssemblyB 的強名稱。 請勿包含元件版本、文化特性、架構或公鑰令牌。
如果 元件 A 不是強名稱,friend 元件名稱應該只包含元件名稱。 如需詳細資訊,請參閱 如何:建立未簽署的朋友元件。
如果 AssemblyB 為強名稱,您必須使用項目設定或命令行
/keyfile
編譯程式選項來指定 AssemblyB 的強名稱索引鍵。 如需詳細資訊,請參閱 如何:建立已簽署的朋友元件。
StrongNameIdentityPermission 類別也會提供共用類型的功能,但有下列差異:
StrongNameIdentityPermission 適用於個別類型,而 Friend 組件適用於整個組件。
如果您想要與 AssemblyB 共用的元件 A 中有數百種類型,則必須新增StrongNameIdentityPermission至所有類型。 如果使用 friend 組件,您只需要宣告 friend 關聯性一次。
如果您使用 StrongNameIdentityPermission,則您想要共用的類型必須宣告為公用。 如果您使用 friend 元件,共用類型會宣告為
internal
(C#) 或Friend
(Visual Basic)。
如需如何從模組檔案存取元件 internal
(C#) 或 Friend
(Visual Basic) 類型和方法的相關信息(擴展名為 .netmodule 的檔案),請參閱 ModuleAssemblyName (C#) 或 -moduleassemblyname (Visual Basic) 。