下面的例子演示了創建簽名程序集和有元程序集。這就要求兩個程序集都是強命名,在下面的例子中,兩個程序集都用了同一個秘鑰,也可以用不同的秘鑰。
1. 生成秘鑰, 這個在前面的博客中有說明,生成秘鑰文件sn.exe.
得到了公鑰密碼,如圖
2. 創建C#文件,friend_signed_A。代碼應用InternalsVisibleToAttribute 聲明 friend_signed_B為有元程序集。這時要把公鑰加進代碼中。
using System.Text; using System.Threading.Tasks; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("friend_signed_B,PublicKey=0024000004800000940000000602000000240000525341310004000001000100d980f66fe7e3556e8f00bd78f66a96c9e67e12457b6e4473f7476ebaa380ba0186b8028f5734f21313b48715ab814f49fef36c155700bc87fac9a2b52b1e3d1f66f98a2a8f8583dfd0572f6743f391e1415295f599662ee5a7b184b6b020c89a5ad6ceacbbe7904aa919f1e26e2ed8059c86fd051e6a087cdfcf52af7db9b7a9")] namespace friend_signed_A { public class Class1 { public void Test() { Console.WriteLine("Class1.Test"); Console.ReadKey(); } } }
3. 編譯簽名程序集 friend_signed_A,csc /t:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
4. 創建程序集 friend_signed_B,該程序集是friend_signed_A的有元程序集,所以它可以訪問friend_signed_A中internal類型的成員。並且它也需要要強命名的。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using friend_signed_A; namespace friend_signed_B { class Program { static void Main(string[] args) { Class1 inst = new Class1(); inst.Test(); } } }
5. 編譯並給friend_signed_B簽名。csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
6. 直接運行friend_signed_B.exe