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