下面的例子演示了創建簽名程序集和有元程序集。這就要求兩個程序集都是強命名,在下面的例子中,兩個程序集都用了同一個秘鑰,也可以用不同的秘鑰。
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
