- 关 键 词:
- .net framework
- asp.net
- 执行文件
- nat
好久没在这贴原创的帖子了,尤其是用中文:)这次本来是想和bigeagle探讨一下CLR的,但是,等到动笔时我又改变了主意,主题更为广泛,包括ASP.Net,XML,CLR和IL也许还有Web Service,呵呵,其原因有二:一是CLR这个话题太枯燥,很多朋友没有兴趣,没人理睬的文章我也没有写下去的动力;二是我想我写的越多,暴露的缺点也越多,可以从大家那里获得很多指点,我会获益匪浅(有点自私啊:))。这次计划写很长,我自己也没什么把握,呵呵。
言归正传
第一章Assemblies
sigh,也是很没劲的话题,你可能会想。但也许你咬着牙读完的时候,会发现它其实很有趣。OK,Let’s begin。CLR(Common Language Runtime)要求所有的类型都要归属于一个Assembly。Assemblies在.Net Framework中的角色是组件代码的最小可分发单位。一些关于Assemblies的要点
l Assemblies是类型定义的集合
l 类型名是由它所处的Assembly检查的
l 只有标记为public的类型和成员才能在Assembly的外部可见
l 标记为internal的成员和类型在Assembly的外部不能访问
l 标记为private的成员在声明它们的类型的外部是不可见的
1.1
Assemblies和modules
一个Assembly包含一个或多个物理文件(modules),module是一个包括代码和metadata的可执行文件,每个module都可能是用不同的语言生成的,在一个Assembly里一个module包含一份Assembly manifest。Csc.exe /t:module和/addmodule开关支持module级的编译和引用。默认的情况下,csc.exe /t:module生成的文件会有一个.netmodule的扩展名。这时,它是不包含manifest的,这种文件是不能被CLR加载的。然而这样的文件却可以通过/addmodule开关整合到assembly manifest中。而al.exe可以连接(link)多个module并创建manifest。
/t:module
.module test.netmodule |
.assembly extern mscorlib .assembly extern Michael |
.class public PP{ .field [michael]Bassist wangpeng } |
/t:library
.module test.dll |
.assembly extern mscorlib .assembly extern Michael |
.class public PP{ .field [michael]Bassist wangpeng } |
.assembly test(manifest) |
再举一个multi-module assembly的例子
/t:library /addmodule:winform.netmodule, webservice.netmodule
.module forum.dll |
.assembly extern mscorlib .assembly extern Joy .assembly extern Bigeagle |
.class public Master{} |
.assembly forum(由此向下是manifest并注意下两个表格与它的关系) |
.file winform.netmodule .file webservice.netmodule |
.class extern public WS{ .file webservice.netmodule .class nnnn } .class extern public WF{ .file winform.netmodule .class nnnn } |
/t:module
.module webservice.netmodule |
.assembly extern mscorlib .assembly extern Bigeagle |
.class extern public WS{ .field [Bigeagle] Bassist m } |
/t:module
.module winform.netmodule |
.assembly extern mscorlib .assembly extern Joy |
.class extern public WF{ .field [Joy] Singer m } |
Code.cs→csc.exe /t:module→code.netmodule
Component.cs→cscs.exe /t:library /addmodule:code.netmodule→component.dll
Component Assembly
code.netmodule |
component.dll |
Application.cs→csc /r:component.dll→application.exe(Application Assembly)
1.2Public Keys and Assemblies
Assemblies用Public Keys技术来识别开发者和防止破坏
要点:
1. 加密的签名是基于public/private钥对的。
2. 没有重新签名是无法更改assembly的。
3. 在生成的Assemblies中包含1024bit的RSA public key
4. 引用Assemblies的文件包含64bit的public key的hash
5. Sn.exe用来管理public/private key文件
6. AssemblyKeyFile和AssemblyDelaySign属性将Assemblies和keys联系起来
用sn.exe管理public/private key文件
sn.exe -k publicprivate.snk
↓
publicprivate.snk Public Ke(128 bytes + 32byte header) Private Key (436 bytes)
↓
sn.exe -p publicprivate.snk public.snk
↓
public.snk Public Key(128 bytes + 32byte header)
↓
sn.exe -t public.snk
↓
Public key token is 883dd0182e81d815
Strong Assembly References
Mylib.cs [TABLE align=left]
using System.Reflection;
[assembly: AssemblyKeyFile("publicprivate.snk")]
[assembly: AssemblyDelaySign(false)]
↓
Public Key(128 bytes + 32byte header) |
Private Key (436 bytes) |
publicprivate.snk |
←csc /t:library mylib.cs
↓
mylib.dll ↓
PE/COFF Header | CLR Header
| Code |
↑
myapp.exe ↑
PE/COFF Header | CLR Header
|



