签名有元程序集 Signed Friend Assemblies

下面的例子演示了创建签名程序集和有元程序集。这就要求两个程序集都是强命名,在下面的例子中,两个程序集都用了同一个秘钥,也可以用不同的秘钥。

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

 

posted @ 2016-11-01 10:21  HepburnXiao  阅读(209)  评论(0编辑  收藏  举报