如何:创建签名的友元程序集(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. Linux-数据库2

    表记录的操作 增 1.插入一条记录 语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); ...

  2. set集合玩法、三目运算

    set是无序的,无法用下标获取值 创建set二种方式 1.第一种 s1=set()   #创建一个空的set,看下面就知道为什么要这么创建一个空的集合 2.第二种 s2={11,22,33,44} # ...

  3. 深入理解javascript作用域系列第四篇

    前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的 ...

  4. luoguP4206 [NOI2005]聪聪与可可 期望概率DP

    首先,分析一下这个猫和鼠 猫每局都可以追老鼠一步或者两步,但是除了最后的一步,肯定走两步快些.... 既然猫走的步数总是比老鼠多,那么它们的距离在逐渐缩小(如果这题只能走一步反而不能做了...) 猫不 ...

  5. UVA11107 Life Forms --- 后缀数组

    UVA11107 Life Forms 题目描述: 求出出现在一半以上的字符串内的最长字符串. 数据范围: \(\sum len(string) <= 10^{5}\) 非常坑的题目. 思路非常 ...

  6. [BZOJ3203][SDOI2013]保护出题人(凸包+三分)

    https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去. #include<cstdio&g ...

  7. HOJ 2645 WNim sg函数 博弈论

    http://blog.csdn.net/y1196645376/article/details/52165245 这道题我没有写,因为我就算翻译了我也找不到数据范围,也分不清数据变量的命名,而且ho ...

  8. 二维数组sort排序

    和副本任务完全无关的奇怪感慨: 完全搞不懂我为什么会在搞图论的时候学这种奇怪东西,需要的时候不会,不需要的时候又莫名增加了奇怪的技能点. 之前的假期规划在十多天的放飞自我中彻底泡汤,简单的图论都一点不 ...

  9. bzoj 1010 斜率优化DP

    我的第二道斜率DP. 收获: 1.假设两个位置:p<q<i,然后让某一位置优,看其满足什么性质,所谓斜率优化就是满足: (g[q]-g[p])/(f[q]-f[p])  op h[i] 要 ...

  10. ADC Power Supplies

    http://www.planetanalog.com/author.asp?section_id=3041&doc_id=563055 Jonathan Harris, Product Ap ...