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