学习笔记《.NET框架程序设计(修订版)》--第三章 共享程序集 (2)

.net框架|笔记|程序|设计

3.4 引用强命名程序集
1、第二章里提到用 CSC.exe 的 /reference 命令行开关来指定期望引用的程序集文件名。如果文件名包含了完整路径,则 CSC.exe 加载指定路径下的文件。如果指定的是不带路径的文件,它将在以下目录中查找引用的程序集:
a、当前工作路径;
b、编译器目前使用的CLR所在的目录。MSCorLib.dll总是包含在该目录中(System.Object就定义在这个程序集中)。该目录类似于:
C:\Windows\Micorsoft.NET\Framework\v1.0.3427 ;
c、任何用CSC.exe的 /lib 命令行开关指定的目录;
d、任何LIB环境变量中指定的目录。

安装.NET框架时,微软的程序集文件会被分别拷贝到 CLR所在目录及 GAC目录中。在CLR所在目录中拷贝是使我们能够方便的生成自己的程序集;GAC中的拷贝则是用于运行时加载这些程序集。
CSC.exe 不在GAC 中查找所引用的程序集的原因是因为需要指定的路径比较麻烦。

2、响应文件(response file):是一个包含一组编译器命令行开关的文本文件。执行CSC.exe 命令时,编译器会打开响应文件,并象使用通用命令行传递的开关一样使用响应文件中指定的命令行开关。
例子:
一个响应文件MyProject.rsp 包含下列文本:
/out:MyProject.exe
/target:winexe
为了使CSC.exe利用这些设置,可以象这样调用:
csc.exe @MyProject.rsp CodeFile1.cs CodeFile2.cs

C#编译器支持多个响应文件。
运行CSC.exe时它会自动在当前目录中搜索一个本地的CSC.rsp文件;另外编译器还会在CSC.exe所在的目录中搜索一个全局的CSC.rsp文件。
本地响应文件和全局响应文件中的设置有冲突时,本地响应文件中的设置将覆盖全局响应文件的设置;类似的,显示传递给CSC.exe的设置也将覆盖本地响应文件中的设置。
CSC.rsp包含类似以下的命令行:
/r:Systme.dll
/r:Accessibility.dll
/r:System.Data.dll
等等;
需要的话我们也可以向CSC.rsp文件中添加自己的命令行开关。

3.5 强命名程序集的防篡改特性
1、用私有密钥为程序集签名可以确保该程序集的生产者为对应公有密钥的持有者:
a、当程序集被安装到GAC目录内时,系统将会对包含清单的文件内容进行散列转换,并用得到的散列值来和嵌入在PE文件中的RSA数字签名进行比较。如果相同证明程序集文件的内容没有被篡改,并且可以知道我们拥有着和发布者的私有密钥相对应的公有密钥;
b、系统会对程序集中其他文件的内容进行散列转换,然后将得到的散列值和清单文件中FileDef表内存储的散列值进行比较。如果发现有任何不匹配的情况,则证明至少有一个程序集的文件被篡改了。

2、当应用程序需要绑定一个程序集时,CLR将使用所引用的程序集的一些属性(名称、版本、语言文化及公有密钥)来在GAC中定位程序集。
如果找到被引用的程序集,它所在的子目录被返回,保存清单的那个文件将被加载。这样确保了运行时加载的程序集和编译时生成的程序集总时来自同一个发布者。
如果被引用的程序集不在GAC中:
b、CLR将在应用程序的基目录中查找,如果还没找到则
c、CLR将到应用程序的配置文件中标识的私有路径中查找
d、如果应用程序时使用MSI来安装的,CLR会要求MSI来定位程序集。
如果找不到程序集绑定失败系统抛出一个 System.IO.FileFoundException 异常。

当强命名程序集文件是从一个非GAC的地方加载时CLR会在程序集被加载的时候比较散列值(若是GAC中加载,则在程序安装时比较散列值?)。如果检测到散列值不匹配抛出 System.IO.FileLoadException 异常。

时间: 2025-01-20 14:37:32

学习笔记《.NET框架程序设计(修订版)》--第三章 共享程序集 (2)的相关文章

node.js学习笔记(16) child_process(三)

学习过前两篇笔记的源码分析,再来应用child_process的7个方法就不难理解了. By default, pipes for stdin, stdout and stderr are established between the parent Node.js process and the spawned child. 默认情况下,Node.js主进程和子进程间就会建立三个管道:stdin.stdout和stderr,即标准输入流.标准输出流和标准错误流. 如今热播的<芈月传>中有一段

hibernate3学习笔记(二十三)|进阶特性(三)

6.从数据表生成映射文件 可以从资料库的表格自动生成映射文件,首先 下载 Middlegen-Hibernate,下载後将之解压缩. 这边所使用的资料库是MySQL,并假设您的资料库中已有以下的表格: CREATE TABLE user ( id INT(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(100) NOT NULL default '', age INT ); 进入Middlegen-Hibernate解压缩後的confi

node.js学习笔记(28) node-orm进阶三

也许你想监听Model实例的创建.修改.获取或者删除,那么正好node-rom为Model定义了一系列事件. afterLoad : (no parameters) Right after loading and preparing an instance to be used; afterAutoFetch : (no parameters) Right after auto-fetching associations (if any), it will trigger regardless

jQuery学习笔记之 Ajax操作篇(三) - 过程处理_jquery

观察函数 ajaxStart 和 ajaxStop 函数可以用来作为观察函数,我们可以使用观察函数的回调函数来做相应的处理. 当 Ajax 请求开始且尚未进行其他传输时,会触发 ajaxStart 的回调函数. 当最后一次活动请求终止时,则会执行通过 ajaxStop 注册的回调函数. 由于观察函数具备全局性,所以需要使用 $(document) 来调用.我们通过使用 Ajax 方法取得一个图片的例子来测试两个函数: 当前页面为: <div></div> <button>

hibernate3.0学习笔记

hibernate3学习笔记(二十三)|进阶特性(三) hibernate3学习笔记(二十三)|进阶特性(二) hibernate3学习笔记(二十三)|进阶特性(一) hibernate3学习笔记(二十二)|Query缓存机制 hibernate3学习笔记(二十一)|二级缓存 hibernate3学习笔记(二十)|关系映射:多对多 hibernate3学习笔记(十九)|关系映射:一对一 hibernate3学习笔记(十八)|关系映射:一对多 hibernate3学习笔记(十七)|关系映射:多对一

JavaScript高级程序设计(第三版)学习笔记6、7章_javascript技巧

第6章面向对象的程序设计 对象 1.数据属性 configurable表示能否通过delete删除属性从而重新定义属性能否修改属性的特性或能否把属性修改为访问器属性默认为true enumerbale表示能否通过for-in访问属性默认true writable表示能否修改属性值默认true value数据存储位置默认undefined 修改默认属性特性Object.defineProperty()接收三个参数属性所在对象属性名描述符对象描述符对象属性必须是configurable.enumer

【PMP】Head First PMP 学习笔记 第三章 过程框架

第三章 过程框架 项目中完成的所有工作都由过程构成. 项目中的完成的所有工作都有一个模式(pattern).先计划,再去做.工作时,总是对项目与原先的计划进行比较.如果开始偏离计划,就要由你做出矫正,让一切重新走上正轨.过程框架--过程租和知识领域--正式这一切顺利完成的关键. 分阶段管理 分阶段,项目的每个阶段(phase)都会经过5个过程租,从启动到收尾,项目的多个阶段就会存在各种关联关系 顺序关系(sequenital relationship).多个阶段相继发生并不存在重叠,每个阶段在前

javascript高级程序设计(第三版)学习笔记(一) 正则表达式整理

1.创建正则表达式 第一种方式:注意这里的正则表达式不能使用单引号或者双引号,如下 var pattern1 = /[abc]/i; // 匹配第一个"a"或"b"或"c",不区分大小写 第二种方式:使用RegExp构造函数创建,该构造函数传入两个参数,都是字符串,所以需要特别注意"\"符号的转换,所有元字符(下面有讲元字符)需要双重转义,如下 复制代码 代码如下: var patt1 = new RegExp("[

一个男人和三个女人的故事[《.net框架程序设计》读书笔记

.net框架|笔记|程序|设计|示例 第十一章 多事件示例[一个男人和三个女人的故事] 摘要: 应用FCL中的System.ComponentModel.EventHandlerList示例一个类型中发布多事件的应用 场景:一个男生有三个女朋友,各自有不同的爱好,女朋友A爱好音乐,女朋友B爱好美食,女朋友C爱好XXX,为满足各个女朋友,此男生必须进行唱歌.烹饪食物.xxx. 以此制作程序演示单类型多事件的应用,并假设此男同时只能干一件事情(即排除一边xxx一边唱歌或一边xxx一边烹饪的可能J)