如何:创建签名的友元程序集(C# 和 Visual Basic)

Visual Studio 2013
  

本示例演示了如何将友元程序集和具有强名称的程序集一起使用。 这两种程序集必须都使用强名称。 尽管本示例中的两种程序集使用了相同的密钥,但您可以对这两种程序集使用不同的密钥。

在 Visual Studio 中创建签名的程序集和友元程序集

  1. 打开 Visual Studio 命令提示。

  2. 使用强名称工具,通过以下命令序列生成 keyfile 并显示其公钥。 有关更多信息,请参见Sn.exe(强名称工具)

    1. 生成此示例的强名称密钥,并将其存储在 FriendAssemblies.snk 文件中:

      sn -k FriendAssemblies.snk

    2. 从 FriendAssemblies.snk 文件中提取公钥,将其放入 FriendAssemblies.publickey 中:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

    3. 显示存储在 FriendAssemblies.publickey 文件中的公钥:

      sn -tp FriendAssemblies.publickey

  3. 创建一个名为 friend_signed_A 的 Visual Basic 或 C# 文件,其中包含以下代码。 该代码使用 InternalsVisibleToAttribute 特性将 friend_signed_B 声明为友元程序集。

    强名称工具在每次运行时生成新的公钥。 因此,必须将以下代码中的公钥替换为刚生成的公钥,如下例所示。

     
    // friend_signed_A.cs
    // Compile with:
    // csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
    using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("friend_signed_B, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3aedce99b7e10823920206f8e46cd5558b4ec7345bd1a5b201ffe71660625dcb8f9a08687d881c8f65a0dcf042f81475d2e88f3e3e273c8311ee40f952db306c02fbfc5d8bc6ee1e924e6ec8fe8c01932e0648a0d3e5695134af3bb7fab370d3012d083fa6b83179dd3d031053f72fc1f7da8459140b0af5afc4d2804deccb6")]
    class Class1
    {
    public void Test()
    {
    System.Console.WriteLine("Class1.Test");
    System.Console.ReadLine();
    }
    }
  4. 使用以下命令编译 friend_signed_A 并为其签名。

     
    Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
    
     
    csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
    
  5. 创建一个名为 friend_signed_B 的 Visual Basic 或 C# 文件,并包含以下代码。 由于 friend_signed_A 将 friend_signed_B 指定为友元程序集,因此 friend_signed_B 中的代码可以访问 friend_signed_A 中的 Friend (Visual Basic) 或 internal (C#) 类型和成员。 文件包含以下代码。

     
    // friend_signed_B.cs
    // Compile with:
    // csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
    public class Program
    {
    static void Main()
    {
    Class1 inst = new Class1();
    inst.Test();
    }
    }
  6. 使用以下命令编译 friend_signed_B 并为其签名。

     
    Vbc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll friend_signed_B.vb
    
     
    csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
    

    编译器生成的程序集的名称必须与传递给 InternalsVisibleToAttribute 特性的友元程序集的名称匹配。 可以使用 /out 编译器选项显式设置该程序集。

    在 C# 中,您必须使用 /out 编译器选项显式指定输出程序集(.exe 或 .dll)的名称。 在 Visual Basic 中,这是可选的。 有关更多信息,请参见 /out (Visual Basic) 和 /out(C# 编译器选项)

  7. 运行 friend_signed_B.exe 文件。

    程序将打印字符串“Class1.Test”。

InternalsVisibleToAttribute 特性和 StrongNameIdentityPermission 类之间存在相似性。 主要的差异在于:StrongNameIdentityPermission 可以要求具有安全权限才能运行特定的一段代码,而 InternalsVisibleToAttribute 特性则控制 Friend (Visual Basic) 或 internal (C#) 类型和成员的可见性。

如何:创建签名的友元程序集(C# 和 Visual Basic)的更多相关文章

  1. 友元程序集(C# 和 Visual Basic)

    友元程序集(C# 和 Visual Basic) Visual Studio 2013 “友元程序集”是一种能够访问其他程序集的 Friend (Visual Basic) 或 internal (C ...

  2. InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集

    友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...

  3. 签名有元程序集 Signed Friend Assemblies

    下面的例子演示了创建签名程序集和有元程序集.这就要求两个程序集都是强命名,在下面的例子中,两个程序集都用了同一个秘钥,也可以用不同的秘钥. 1. 生成秘钥, 这个在前面的博客中有说明,生成秘钥文件sn ...

  4. c# 友元程序集

    在团队开发中,如果一个程序集中要调用另外一个程序集,但是要被调用的那个程序集又不想用public来公开自己的类, 那么怎么办,就是用最后一种internal来用来做类的可见性了. 下面来看一个简单例子 ...

  5. DotNet友元程序集解析

    项目开发的过程中,调试使用的可能是最多的操作.任何代码写出来都需要经过调试和整合,以此扩展和提升程序的稳定性和可靠性.谈到.NET的单元测试,在这里就得提提.NET的友元程序集这一特性,也借用.NET ...

  6. C#动态创建和动态使用程序集、类、方法、字段等

    C#动态创建和动态使用程序集.类.方法.字段等 分类:技术交流 (3204)  (3)   首先需要知道动态创建这些类型是使用的一些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使用反射,那么动 ...

  7. 8.C#友元程序集----可访问性相关

    在一个团队或者公司中,一个人开发出来的程序集中的类的可见性有public,private和internal, public:对所有程序集可见,就是说如果拿到程序集.DLL文件,那么类就被公开了. pr ...

  8. 应用程序框架实战十一:创建VS解决方案与程序集

    上一篇,介绍了开发环境需要的工具和版本,本篇将动手创建VS解决方案. 对于本系列文章提供的示例,我想通过两种途径来演示,一种是单元测试,另外为了能更直观的看到效果,还会提供一个用户界面来展示.为了不分 ...

  9. 未签名有元程序集 Unsigned Friend Assemblies

    C#中的访问修饰符internal可以使类型在同程序集中可以被相互访问.但有时会有这样一个要求,我们希望一个程序集中的类型可以被外部的某些程序集访问,如果设置成public的话,就被所有的外部程序集访 ...

随机推荐

  1. 洛谷P2730 魔板 [广搜,字符串,STL]

    题目传送门 魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有 ...

  2. 【Python】单例模式Singleton

    前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...

  3. 类命名空间与对象、实例的命名空间 and 面向对象的组合用法

    类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...

  4. NOIP2017 D2T1奶酪

    这题终于是正经第一题感觉了. 只需要对相交或相切的球建一条边,然后对所有与底面有交点的球连边,再对所有与顶面有交点的球连边,bfs判断上下连通性即可. #include<iostream> ...

  5. hdu 2709 递推

    题意:给出一个数,把他拆成2^n和的形式,问有多少种拆法 链接:点我 对6进行分析 1 1 1 1 1 1 1 1 1 1 2 1 1 2 2 1 1 4 2 2 4 2 4 对最上面4个,显然是由4 ...

  6. [转]JSONObject,JSONArray使用手册

    您的评价:          收藏该经验       这两个是官网的API JSONObject API JSONArray API 里面有这两个类的所有方法,是不可多得的好材料哦~ 配合上面的API ...

  7. Inrush limiter also provides short-circuit protection

    For containing large amounts of bulk capacitance, controlling inrush currents poses problems. The si ...

  8. sql 内连接、外连接、自然连接等各种连接

    1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和c ...

  9. openfire Hazelcast插件集群配置

    原文:http://blog.csdn.net/frankcheng5143/article/details/48708899 注意虽然hazelcast 官方已经有了3.5.2版本,但是openfi ...

  10. DCI:DCI学习总结

    备注 之前把DCI的Role和四色原型的Role给弄混了,本文也不会比较这两种Role的区别(后面有机会再说),这里简单的记录一下对DCI的理解. 参考文章:http://www.cnblogs.co ...