前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

.Net之美读书笔记7

程序集

定义

在.Net框架下,类似C#这样的高级语言经过编译后生成的结果文件被成为程序集(后缀名为.exe或.dll)。

程序集的组成

  • PE/COFF头 使Windows操作系统能够加载并运行
  • CLR头 告诉系统是.Net程序集
  • 清单(manifest) 程序集标识可通过反编译查看
  • 元数据 内容包括程序集包含的模块、类型等
  • CIL代码
  • 资源文件

程序集反编译

  1. 通过“vs开发人员命令提示”编译cs文件。
    csc MyClass.cs编译命令,可为编译制定的参数
参数类型 样例 意义
/t: library 编译为dll库文件
/out: MyClass.dll 输出文件
/r: MyClass.dll 引用程序集
/addmodule: MyFirstModuldle.netModule 加载模块
/resource: ResourceDemo.resx 加载资源
/keyfile: key 加密钥
  1. 程序集反编译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.cscsc /t:module /out:MySecondModule.netmodule MySecondModule.cscsc /addmodule:MyFirstModule.netmodule,MySecondModule.netmodule MainClass.cs
使用模块的好处,运行时可以删除不需要的模块,这样减少了模块的加载。(不过作者推荐用多个小程序集)

强名称程序集

  1. 程序集的版本
    为程序集指定版本,方便以后更改。
  2. 使用公/私钥防止程序集被篡改
    将自己的类库使用密钥编译,防止其他人伪造,伪造的不能运行。这里有点困惑,如果将加密的dll文件反编译为txt,修改内容在和扩展名为il,再编辑为dll,可以篡改。

全局程序集缓存

将多处引用的dll程序集,加入全局缓存区提高效率。加入缓存区gacutil i MyClass.dll,退出缓存区gacutil u MyClass.dll

posted @ 2017-12-15 18:01  LoveTomato  阅读(214)  评论(0编辑  收藏  举报