分享方式:


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 AAssembly C 的 friend 參考 AssemblyB則元件 C 無法存取internal元件 A 中的 (C#) 或 Friend [Visual Basic] 類型。

編譯器會執行一些被傳遞給 InternalsVisibleToAttribute 屬性的 Friend 組件名稱的基本驗證。 如果 元件 AAssemblyB 宣告為 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)

另請參閱