標籤:
如何:建立簽名的friend 組件(C# 和 Visual Basic)
Visual Studio 2013
本樣本示範了如何將friend 組件和具有強式名稱的程式集一起使用。 這兩種程式集必須都使用強式名稱。 儘管本樣本中的兩種程式集使用了相同的密鑰,但您可以對這兩種程式集使用不同的密鑰。
在 Visual Studio 中建立簽名的程式集和friend 組件
開啟 Visual Studio 命令提示。
使用強式名稱工具,通過以下命令序列產生 keyfile 並顯示其公開金鑰。 有關更多資訊,請參見Sn.exe(強式名稱工具)。
產生此樣本的強式名稱密鑰,並將其儲存在 FriendAssemblies.snk 檔案中:
sn -k FriendAssemblies.snk
從 FriendAssemblies.snk 檔案中提取公開金鑰,將其放入 FriendAssemblies.publickey 中:
sn -p FriendAssemblies.snk FriendAssemblies.publickey
顯示儲存在 FriendAssemblies.publickey 檔案中的公開金鑰:
sn -tp FriendAssemblies.publickey
建立一個名為 friend_signed_A 的 Visual Basic 或 C# 檔案,其中包含以下代碼。 該代碼使用 InternalsVisibleToAttribute 特性將 friend_signed_B 聲明為friend 組件。
強式名稱工具在每次運行時產生新的公開金鑰。 因此,必須將以下代碼中的公開金鑰替換為剛產生的公開金鑰,如下例所示。
C#VB // friend_signed_A.cs// Compile with: // csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.csusing System.Runtime.CompilerServices;[assembly: InternalsVisibleTo("friend_signed_B, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3aedce99b7e10823920206f8e46cd5558b4ec7345bd1a5b201ffe71660625dcb8f9a08687d881c8f65a0dcf042f81475d2e88f3e3e273c8311ee40f952db306c02fbfc5d8bc6ee1e924e6ec8fe8c01932e0648a0d3e5695134af3bb7fab370d3012d083fa6b83179dd3d031053f72fc1f7da8459140b0af5afc4d2804deccb6")]class Class1{ public void Test() { System.Console.WriteLine("Class1.Test"); System.Console.ReadLine(); }}
使用以下命令編譯 friend_signed_A 並為其簽名。
VB Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
C# csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
建立一個名為 friend_signed_B 的 Visual Basic 或 C# 檔案,並包含以下代碼。 由於 friend_signed_A 將 friend_signed_B 指定為friend 組件,因此 friend_signed_B 中的代碼可以訪問 friend_signed_A 中的 Friend (Visual Basic) 或 internal (C#) 類型和成員。 檔案包含以下代碼。
C#VB // friend_signed_B.cs// Compile with: // csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cspublic class Program{ static void Main() { Class1 inst = new Class1(); inst.Test(); }}
使用以下命令編譯 friend_signed_B 並為其簽名。
VB Vbc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll friend_signed_B.vb
C# csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
編譯器產生的程式集的名稱必須與傳遞給 InternalsVisibleToAttribute 特性的friend 組件的名稱匹配。 可以使用 /out 編譯器選項顯式設定該程式集。
在 C# 中,您必須使用 /out 編譯器選項顯式指定輸出程式集(.exe 或 .dll)的名稱。 在 Visual Basic 中,這是可選的。 有關更多資訊,請參見 /out (Visual Basic) 和 /out(C# 編譯器選項)。
運行 friend_signed_B.exe 檔。
程式將列印字串“Class1.Test”。
安全性
InternalsVisibleToAttribute 特性和 StrongNameIdentityPermission 類之間存在相似性。 主要的差異在於:StrongNameIdentityPermission 可以要求具有安全許可權才能運行特定的一段代碼,而 InternalsVisibleToAttribute 特性則控制 Friend (Visual Basic) 或 internal (C#) 類型和成員的可見度。
請參見 任務如何:建立未簽名friend 組件(C# 和 Visual Basic)參考InternalsVisibleToAttribute/keyfileSn.exe(強式名稱工具)概念程式集和全域組件快取(C# 和 Visual Basic)friend 組件(C# 和 Visual Basic)C# 編程指南其他資源建立和使用具有強式名稱的程式集Visual Basic 編程指南
如何:建立簽名的friend 組件(C# 和 Visual Basic)