- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
dotnetframework
chapter1:ASSEMBLY
创建多文件程序集的原因有以下几个:
(1)合并用不同语言编写的模块。这是创建多文件程序集最常见的原因。
(2)将不常用的类型放在只在需要时才下载的模块中,以优化应用程序的下载。
(3)合并由几个开发人员编写的代码模块。虽然每一位开发人员都可以将各个代码模块编译成程序集,但这样会强制一些类型公开(如果所有模块均放在多文件程序集中,则不会公开)。
AL工具只产生一个除了清单外不包括任何其他内容的EXE或者DLL PE文件,其中的清单只用于描述其他模块中的类型。
.method privatescope static void __EntryPoint$PS) cil managed
{
.entrypoint
// 代码大小 8 (0x8)
.maxstack 8
IL_0000: tail.
IL_0002: call void [.module module]t1::Main()
IL_0007: ret
} // end of method Global Functions::__EntryPoint
这段代码仅仅是调用了一个netmodule文件中的APP类型Main方法。
没有指定语言文化的程序集被称为是语言文化中性程序集。
CLR定位程序集
探测应用程序集和区域性目录
运行库始终在应用程序集中开始探测,应用程序集可以是一个 URL,也可以是计算机上的应用程序根目录。如果在应用程序集中没有找到引用的程序集,并且未提供区域性信息,则运行库使用程序集名称搜索任何子目录。探测的目录包括:
[application base] / [assembly name].dll
[application base] / [assembly name] / [assembly name].dll
如果指定了引用的程序集的区域性信息,则只探测以下目录:
[application base] / [culture] / [assembly name].dll
[application base] / [culture] / [assembly name] / [assembly name].dll
使用 privatePath 属性进行探测
除区域性子目录和为引用的程序集指定的目录外,运行库还探测使用 probing 元素的 privatePath 属性指定的目录。使用 privatePath 属性指定的目录必须是应用程序根目录的子目录。根据在引用的程序集请求中是否包含区域性信息,探测的目录会有所不同。
运行库在找到第一个与引用的简单程序集名称匹配的程序集时停止探测,无论该匹配正确与否。如果该程序集是正确的匹配项,则使用它。如果该程序集不是正确的匹配项,则停止探测,绑定失败。
如果包含区域性,则探测以下目录:
[application base] / [binpath] / [culture] / [assembly name].dll
[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll
如果不包含区域性信息,则探测以下目录:
[application base] / [binpath] / [assembly name].dll
[application base] / [binpath] / [assembly name] / [assembly name].dll
共享assembly
对于弱命名程序集可以在清单元素中嵌入版本号和语言文化特性,但CLR总会忽略版本号,因为弱命名程序集总是以私有方式部署的,所以CLR在程序集的基目录或任何子目录中搜索程序集时,它只需利用该程序集的名称。
强命名程序集: 文件名 版本号 语言信息 发布者私钥签名。
SN –k MyCompany.keys
创建一个只包含共有密钥的文件 sn –p MyCompany.keys MyCompany.publickeys
查看 sn –tp MyCompany.publickeys
共有密钥标记:public key token 是共有密钥的散列值
[assembly:AssemblyKeyFile(“MyCompany.keys”)]
当编译器将打开指定的文件,用私有密钥对程序集(包含清单的程序集文件)进行签名,并将共有密钥潜入到清单中。
当生成一个强命名程序集时,FileDef清单元数据表包含组成该程序集的所有文件的一个列表,当每个文件的名称被加入到清单中时,文件的内容也会被转换成一
文档评论(0)