共用方式為


Friend 組件 (C# 程式設計手冊)

更新:2007 年 11 月

組件中的內部型別或內部成員可以從另一個組件存取。

備註

Friend 組件功能可讓您存取內部成員;私用型別和私用成員仍無法存取。

若要讓某個組件 (組件 B) 存取另一個組件 (組件 A ) 的內部型別和成員,請使用組件 A 中的 InternalsVisibleToAttribute 屬性。

注意事項:

針對會存取另一個組件 (組件 A) 的內部型別或內部成員的組件 (組件 B) 進行編譯時,您必須使用 /out 編譯器選項,明確指定輸出檔 (.exe 或 .dll) 的名稱 (如需詳細資訊,請參閱 /out)。這是需要的,因為當編譯器繫結至外部參考時,它尚未替正在建立的組件產生名稱。

StrongNameIdentityPermission 類別也提供共用型別的功能,但兩者差異如下:

  • StrongNameIdentityPermission 適用於個別型別,而 friend 組件適用整個組件。

  • 如果要將組件 A 中數百個型別與組件 B 共用,則須以 StrongNameIdentityPermission 裝飾所有型別,但如果使用 friend 組件,則只需宣告 friend 關係一次即可。

  • 若使用 StrongNameIdentityPermission,您要共用的型別必須宣告為公用。若使用 friend 組件,共用的型別會宣告為內部型別。

  • 如需如何建置可存取組件中非公用型別之 .netmodule 的詳細資訊,請參閱 /moduleassemblyname

範例

在此範例中,組件會讓名為 cs_friend_assemblies_2 的組件可以看見內部型別和內部成員。

// cs_friend_assemblies.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
using System;

[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]

// internal by default
class Class1 
{
    public void Test() 
    {
        Console.WriteLine("Class1.Test");
    }
}

// public type with internal member
public class Class2 
{
    internal void Test() 
    {
        Console.WriteLine("Class2.Test");
    }
}

在這個範例中,組件會取用 cs_friend_assemblies.dll 組件中的內部型別和內部成員。

請注意,您必須明確指定輸出檔的名稱 (/out:cs_friend_assemblies_2.exe)。

如果這個組件讓另一個組件 (組件 C) 存取其內部型別和成員,組件 C 並不會自動成為 cs_friend_assemblies.dll 組件的 Friend。

// cs_friend_assemblies_2.cs
// compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
public class M 
{
    static void Main() 
    {
        // access an internal type
        Class1 a = new Class1();
        a.Test();

        Class2 b = new Class2();
        // access an internal member of a public type
        b.Test();
    }
}

Class1.Test
Class2.Test

此範例示範如何讓擁有強式名稱的組件可以使用內部型別和成員。

若要產生 keyfile (金鑰檔) 並顯示公開金鑰,請使用下列 sn.exe 命令的序列 (如需詳細資訊,請參閱強式名稱工具 (Sn.exe)):

  • sn -k friend_assemblies.snk // 產生強式名稱金鑰

  • sn -p friend_assemblies.snk key.publickey // 從 key.snk 抽取公開金鑰至 key.publickey

  • sn -tp key.publickey // 顯示儲存於 file'key.publickey 的公開金鑰

使用 /keyfile 將 keyfile 傳遞至編譯器。

// cs_friend_assemblies_3.cs
// compile with: /target:library /keyfile:friend_assemblies.snk
using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("cs_friend_assemblies_4, PublicKey=0024000004800000940000000602000000240000525341310004000001000100031d7b6f3abc16c7de526fd67ec2926fe68ed2f9901afbc5f1b6b428bf6cd9086021a0b38b76bc340dc6ab27b65e4a593fa0e60689ac98dd71a12248ca025751d135df7b98c5f9d09172f7b62dabdd302b2a1ae688731ff3fc7a6ab9e8cf39fb73c60667e1b071ef7da5838dc009ae0119a9cbff2c581fc0f2d966b77114b2c4")]
class Class1 
{
    public void Test() 
    {
        System.Console.WriteLine("Class1.Test");
    }
}

本範例示範如何取用具有強式名稱的組件可使用的內部型別和成員。

// cs_friend_assemblies_4.cs
// compile with: /keyfile:friend_assemblies.snk /reference:cs_friend_assemblies_3.dll /out:cs_friend_assemblies_4.exe
public class M 
{
    static void Main() 
    {
        Class1 a = new Class1();
        a.Test();
    }
}

Class1.Test

請參閱

概念

C# 程式設計手冊

參考

組件和全域組件快取 (C# 程式設計手冊)