如何:创建签名的友元程序集(C# 和 Visual Basic)
如何:创建签名的友元程序集(C# 和 Visual Basic)
本示例演示了如何将友元程序集和具有强名称的程序集一起使用。 这两种程序集必须都使用强名称。 尽管本示例中的两种程序集使用了相同的密钥,但您可以对这两种程序集使用不同的密钥。
在 Visual Studio 中创建签名的程序集和友元程序集
打开 Visual Studio 命令提示。
使用强名称工具,通过以下命令序列生成 keyfile 并显示其公钥。 有关更多信息,请参见Sn.exe(强名称工具)。
生成此示例的强名称密钥,并将其存储在 FriendAssemblies.snk 文件中:
sn -k FriendAssemblies.snk
从 FriendAssemblies.snk 文件中提取公钥,将其放入 FriendAssemblies.publickey 中:
sn -p FriendAssemblies.snk FriendAssemblies.publickey
显示存储在 FriendAssemblies.publickey 文件中的公钥:
sn -tp FriendAssemblies.publickey
创建一个名为 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();
}
}使用以下命令编译 friend_signed_A 并为其签名。
Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
创建一个名为 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 并为其签名。
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# 编译器选项)。
运行 friend_signed_B.exe 文件。
程序将打印字符串“Class1.Test”。
InternalsVisibleToAttribute 特性和 StrongNameIdentityPermission 类之间存在相似性。 主要的差异在于:StrongNameIdentityPermission 可以要求具有安全权限才能运行特定的一段代码,而 InternalsVisibleToAttribute 特性则控制 Friend (Visual Basic) 或 internal (C#) 类型和成员的可见性。
如何:创建签名的友元程序集(C# 和 Visual Basic)的更多相关文章
- 友元程序集(C# 和 Visual Basic)
友元程序集(C# 和 Visual Basic) Visual Studio 2013 “友元程序集”是一种能够访问其他程序集的 Friend (Visual Basic) 或 internal (C ...
- InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集
友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...
- 签名有元程序集 Signed Friend Assemblies
下面的例子演示了创建签名程序集和有元程序集.这就要求两个程序集都是强命名,在下面的例子中,两个程序集都用了同一个秘钥,也可以用不同的秘钥. 1. 生成秘钥, 这个在前面的博客中有说明,生成秘钥文件sn ...
- c# 友元程序集
在团队开发中,如果一个程序集中要调用另外一个程序集,但是要被调用的那个程序集又不想用public来公开自己的类, 那么怎么办,就是用最后一种internal来用来做类的可见性了. 下面来看一个简单例子 ...
- DotNet友元程序集解析
项目开发的过程中,调试使用的可能是最多的操作.任何代码写出来都需要经过调试和整合,以此扩展和提升程序的稳定性和可靠性.谈到.NET的单元测试,在这里就得提提.NET的友元程序集这一特性,也借用.NET ...
- C#动态创建和动态使用程序集、类、方法、字段等
C#动态创建和动态使用程序集.类.方法.字段等 分类:技术交流 (3204) (3) 首先需要知道动态创建这些类型是使用的一些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使用反射,那么动 ...
- 8.C#友元程序集----可访问性相关
在一个团队或者公司中,一个人开发出来的程序集中的类的可见性有public,private和internal, public:对所有程序集可见,就是说如果拿到程序集.DLL文件,那么类就被公开了. pr ...
- 应用程序框架实战十一:创建VS解决方案与程序集
上一篇,介绍了开发环境需要的工具和版本,本篇将动手创建VS解决方案. 对于本系列文章提供的示例,我想通过两种途径来演示,一种是单元测试,另外为了能更直观的看到效果,还会提供一个用户界面来展示.为了不分 ...
- 未签名有元程序集 Unsigned Friend Assemblies
C#中的访问修饰符internal可以使类型在同程序集中可以被相互访问.但有时会有这样一个要求,我们希望一个程序集中的类型可以被外部的某些程序集访问,如果设置成public的话,就被所有的外部程序集访 ...
随机推荐
- asp.net core集成MongoDB
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...
- Linux-数据库1
数据库介绍 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种 ...
- django 编码错误
估计这个问题是2.7的问题3.0好像就统一utf编码了 报错代码: python :ascii codec can't decode byte 0xe8 in posi 当django中报这个错误的时 ...
- Linux-I/O五种模型
一. 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 同步(Sync)/异步(Async) 阻塞(Block)/非阻塞(Unbloc ...
- 51nod2000 四边形分割平面 规律题
观察样例,$ans(1) = 1, ans(2) = 10$,再手推一组,$ans(3) = 26$ 可以发现规律$ans(n) = (2n - 1)^2 + 1$ 如果还是没看出规律,那么打个程序去 ...
- 2017-2018-1 JAVA实验站 第四、五周作业
2017-2018-1 JAVA实验站 第四.五周作业 JAVA实验站小组成员 学号 名字 职务 20162318 张泰毓 组长 20162303 石亚鑫 组员 20162304 张浩林 组员 201 ...
- poj 1733 并查集+hashmap
题意:题目:有一个长度 已知的01串,给出多个条件,[l,r]这个区间中1的个数是奇数还是偶数,问前几个是正确的,没有矛盾 链接:点我 解题思路:hash离散化+并查集 首先我们不考虑离散化:s[x] ...
- 基于Java 生产者消费者模式(详细分析)
Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...
- ACM -- 算法小结(十)素数的两种打表法
素数的两种打表法 下面介绍两种素数打表法,由于是两年前留下的笔记,所以没有原创链接~~ @_@!! 第一种疯狂打表法: #include<stdio.h> #include<math ...
- Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present 记忆化搜索
D. Mysterious Present 题目连接: http://www.codeforces.com/contest/4/problem/D Description Peter decided ...