其中编译期逻辑上也可分为两步:
CLR(C#)编译器接受源代码文件,并编译为托管模块.托管模块包括IL代码,元数据,CLR头等组成部分.上面的例子中就是将HelloWorld.txt编译成托管模块.
一般程序集都会包含很多源代码文件(这里只有HelloWorld.txt)和资源文件,第二步就是把各个源代码文件和资源文件对应编译结果合并成程序集.
执行上面两步就可以得到一个XX.dll或XX.exe的程序集.就像上面的Hello.exe.
编译器如何知道要编译成托管模块还是资源文件?其实是必须明确告诉编译器每个文件的怎么编译,这个对应Visual Studio的文件属性的生成操作.
右击任何Visual Studio解决资源方案的文件-->属性-->生成操作:

指定Class1为嵌入的资源,用ILSpy查看会发现只是把Class1嵌入到程序集中,名称为:命名空间.文件名:

你甚至可以将一张图片设为编译让编译器试图去编译它,不过会报错.
运行期
上面生成了程序集,程序集内的是IL代码,它还不是可运行的代码.IL是与CPU无关的机器语言.直到程序集被调用,才会由JIT(Just-in-Time,实时)编译器编译为本机代码(CPU指令).在运行时,CLR执行如下步骤:
◆ 检查程序集的安全特性;
◆ 在内存中分配空间;
◆ 把程序集中的可执行代码发送给JIT编译器,把其中一部分编译成本机代码(CPU指令).
程序集的可执行代码在需要的时候由JIT编译编译,然后本机代码(CPU指令)就被缓存以备后来的程序中执行.一旦应用程序终止,编译好的本机代码也会被丢弃.
例如如果将上面的代码改为:
- static void Main(string[] args) { Console.WriteLine("Hello");
- Console.WriteLine("World!"); Console.ReadKey();
- }










