Friend 組件

Friend 元件 是一種元件,可以存取另一個元件的 內部 (c # ) 或 friend (Visual Basic) 類型和成員。 如果將組件指定為 friend 組件,就不再需要將類型和成員標記為 public,以供其他組件存取。 這在下列情況下特別方便:

  • 在單元測試期間,當測試程式碼在另一個組件中執行,但需要存取所測試組件中標記為 internal (C#) 或 Friend (Visual Basic) 的成員時。

  • 當您要開發類別庫且類別庫的新增項目包含在不同的組件,但需要存取現有組件中標記為 internal (C#) 或 Friend (Visual Basic) 的成員時。

備註

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

注意

當您編譯的元件(例如 AssemblyB )將會存取另一個元件的內部類型或內部成員(例如 元件 A)時,您必須使用 -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

只有明確指定為 friend 的元件才能存取 internal (c # ) 或 Friend (Visual Basic) 類型和成員。 例如,如果 AssemblyB元件 a 的 Friend,而 元件 c 參考 AssemblyB,則 元件 C 無法存取 internal (c # ) 或 Friend (元件 a 中的 Visual Basic) 類型。

編譯器會執行一些被傳遞給 InternalsVisibleToAttribute 屬性的 Friend 組件名稱的基本驗證。 如果 元件 A 宣告 AssemblyB 為 friend 元件,則驗證規則如下所示:

  • 如果 元件 A 是強式名稱,則 AssemblyB 也必須具有強式名稱。 傳遞給屬性的 friend 元件名稱必須包含用來簽署 AssemblyB 的元件名稱和強式名稱索引鍵的公開金鑰。

    傳遞給屬性的 friend 元件名稱 InternalsVisibleToAttribute 不可以是 AssemblyB 的強式名稱。 請勿包含元件版本、文化特性、架構或公開金鑰 token。

  • 如果 元件 A 不是強式名稱,則 friend 元件名稱只應包含元件名稱。 如需詳細資訊,請參閱 如何:建立未簽署的 friend 元件

  • 如果 AssemblyB 是強式名稱,您必須使用專案設定或命令列編譯器選項,為 AssemblyB 指定強式名稱索引鍵 /keyfile 。 如需詳細資訊,請參閱 如何:建立簽署的 friend 元件

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)

另請參閱