如何:创建签名的友元程序集(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. 缩略图信息提取工具vinetto

    缩略图信息提取工具vinetto   在Windows操作系统中,为了方便用户快速浏览图片,系统会自动为每个图片生成预览图.预览图默认保存在同目录的Thumbs.db文件中.当图片文件删除后,Thum ...

  2. 【BZOJ 2054】 2054: 疯狂的馒头 (并查集特技)

    Input 第一行四个正整数N,M,p,q Output 一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0). Sample Input 4 3 2 4 Sample Outp ...

  3. Ubuntu系统 安装谷歌 Chrome 浏览器

    在 Ubuntu 16.04 中安装谷歌 Chrome 浏览器,步骤: 1.sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P / ...

  4. HDU4405 Aeroplane chess 飞行棋 期望dp 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=4405   题意:问从起点到终点需要步数的期望,1/6的概率走1.2.3.4.5.6步.有的点a有路可以直接到b, ...

  5. 【9.7校内测试】【二分+spfa】【最长上升子序列】【状压DP+贪心(?)】

    刘汝佳蓝书上的题,标程做法是从终点倒着$spfa$,我是二分答案正着$spfa$判断可不可行.效果是一样的. [注意]多组数据建边一定要清零啊QAQ!!! #include<iostream&g ...

  6. bzoj 2815 灭绝树

    对于一个食物网(一个DAG),一个物种死亡后,某些物种就必然死亡,求出必然死亡的是那些物种. 灭绝树的另一种含义是:“灭绝树跟节点到节点u的路径上的节点由那些原图中从根节点到节点u的所有路径中都经过了 ...

  7. SPOJ 10628. SPOJ COT Count on a tree 可持久化线段树

    这题是裸的主席树,每个节点建一棵主席树,再加个lca就可以了. 历尽艰辛,终于A掉了这一题,这般艰辛也显示出了打代码的不熟练. 错误:1.lca倍增的时候i和j写反了,RE了5次,实在要吸取教训 2. ...

  8. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 1 Edition) C. Little Artem and Random Variable 数学

    C. Little Artem and Random Variable 题目连接: http://www.codeforces.com/contest/668/problem/C Descriptio ...

  9. bzoj 4001 [TJOI2015]概率论 数学

    4010: [HNOI2015]菜肴制作 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  10. hihocoder155周 任务分配

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多 ...