《CLR var C#》读书笔记-CLR的执行模型

1、使用CSC命令操作。

2、所有面向CLR的编译器最终生成的就是一个托管模块。托管模块是一个32位/64位的可执行执行体文件(PE32、PE32+文件),需要CLR才能执行。

托管模块由4部分组成:

第一部分:PE32/PE32+头。1、文件格式。其本身的文件格式决定了其是否可以在64位机器上运行。另外,该头还包括了GUI、CUI或DLL文件,及文件的生成时间等信息。另外,本部分还包括了本地的CPU的相关信息。

第二部分:CLR头。主要包含了CLR的相关信息,包括CLR的版本信息等

第三部分:元数据。用于存储程序信息。一是本程序(本源代码)中的定义的变量和方法等;另一存储本代码中引用的类型和成员。

第四部分:IL代码。中间语言,不像C语言编译器,直接将C程序编译为CPU命令,C#等面向CLR的编译器先把程序变异为IL语言,CLR再将IL语言编译为CPU命令

3、用CSC文件生成托管模块。用例子说明

  • 3.1 创建了3个类:Cat.cs、Dog.cs、Program.cs

具体代码如下:

Cat类:

using System;
namespace Animal
{
    public class Cat
    {
        public void MakeNoise()
        {
            Console.WriteLine("MiaoMiao");
        }
    }
}
Dog类:

using System;
namespace Animal
{
    public class Dog
    {
        public void MakeNoise()
        {
            Console.WriteLine("汪汪");
        }
    }
}

Program类

using System;
using Animal;
public class Program
{
    static void Main(string[] args)
    {
        new Dog().MakeNoise();
        new Cat().MakeNoise();
    }
}

其输出结果将是:汪汪

                               MiaoMiao


  • 3.2  将cs文件编译为托管模块




其会在D:\MyCode文件夹下生成两个.netmodule文件。这个就是托管模块。生成的如下:


  • 3.3 由netmodule生成dll

通过csc命令,将netmodule文件生成Animal.dll,如图所示:


此时,程序集应该是:Animal.dll+Cat.netmodule+Dog.netmodule。三者才是程序集。可以这样理解,Animal.dll是一个目录,当程序用到netmodule文件时,程序会到Animal.DLL中去寻找,类似Linq或数据库的延迟加载,等到用到时才执行,这样节省了带宽,降低了网络要求。

通过IDE生成的DLL则不会出现netmodule文件,DLL包含了Cat.netmodule+Dog.netmodule,使得误以为dll就是程序集。


此时文件夹里的内容如下图所示:


  • 3.4 生成exe

将引用DLL及module生成EXE


此时会在文件夹中全部的内容如下:


  • 3.5运行EXE程序


通过运行,得到理论结果。


4 其他

4.1生成方式

IDE通过根据源文件,直接生成DLL,即DLL中包含了module文件。



这样就可以类型IDE生成的DLL,避免了生成托管模块。可以直接在程序中使用。


参考文章:http://blog.csdn.net/kmguo/article/details/17055065



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值