码迷,mamicode.com
首页 > Web开发 > 详细

.Net之美读书笔记6

时间:2017-12-15 18:17:11      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:指定   cut   log   技术   file   body   高效   table   作者   

程序集

定义

在.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

.Net之美读书笔记6

标签:指定   cut   log   技术   file   body   高效   table   作者   

原文地址:http://www.cnblogs.com/LoveTomato/p/8044333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!