程序集
定义
在.Net框架下,类似C#这样的高级语言经过编译后生成的结果文件被成为程序集(后缀名为.exe或.dll)。
程序集的组成
- PE/COFF头 使Windows操作系统能够加载并运行
- CLR头 告诉系统是.Net程序集
- 清单(manifest) 程序集标识可通过反编译查看
- 元数据 内容包括程序集包含的模块、类型等
- CIL代码
- 资源文件
程序集反编译
- 通过“vs开发人员命令提示”编译cs文件。
csc MyClass.cs
编译命令,可为编译制定的参数
参数类型 | 样例 | 意义 |
---|---|---|
/t: | library | 编译为dll库文件 |
/out: | MyClass.dll | 输出文件 |
/r: | MyClass.dll | 引用程序集 |
/addmodule: | MyFirstModuldle.netModule | 加载模块 |
/resource: | ResourceDemo.resx | 加载资源 |
/keyfile: | key | 加密钥 |
- 程序集反编译CIL代码
ildam /out:1.txt MainClass.exe
可以将MainClass.exe程序集反编译到1.txt文件。
指令名 | 样例 | 意义 |
---|---|---|
.assembly extern | mscorlib | 引用的程序集 |
.assembly | MainClass | 当前程序集 |
.module | MainClass.exe | 当前模块 |
.file | MyFirstModule.netmodule | 引用模块 |
多模块程序集
用vs编译的程序集都为但模块程序集,但是一个程序集中可以包含多个模块。新建 MyFirstMOdule.cs MySecondModule.cs文件分别将其编译为模块,MainClass引用。
using System;
class MyFirstModule
{
public static void Hello()
{
Console.WriteLine("Hello,I am from Module 1");
}
}
using System;
class MySecondModule
{
public static void Hello()
{
Console.WriteLine("Hello,I am from Module 2");
}
}
using System;
class MainClass
{
static void Main()
{
MyFirstModule.Hello();
}
}
编译命令csc /t:module /out:MyFirstModule.netmodule MyFirstModule.cs
、csc /t:module /out:MySecondModule.netmodule MySecondModule.cs
、csc /addmodule:MyFirstModule.netmodule,MySecondModule.netmodule MainClass.cs
使用模块的好处,运行时可以删除不需要的模块,这样减少了模块的加载。(不过作者推荐用多个小程序集)
强名称程序集
- 程序集的版本
为程序集指定版本,方便以后更改。
使用公/私钥防止程序集被篡改
将自己的类库使用密钥编译,防止其他人伪造,伪造的不能运行。这里有点困惑,如果将加密的dll文件反编译为txt,修改内容在和扩展名为il,再编辑为dll,可以篡改。全局程序集缓存
将多处引用的dll程序集,加入全局缓存区提高效率。加入缓存区
gacutil i MyClass.dll
,退出缓存区gacutil u MyClass.dll