《CLR via c#》读后笔记

    
      CLR(Common Language Runtime),就是“公共语言运行时”,有的被称为“公共语言运行库”,能够面向CLR的语言都可以使用CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理和线程同步等等)。
 
 
      CLR的特点:允许在不同编程语言之间方便的切换,同时又保持紧密集成。例如,通过CLR,在一个应用程序中,I/O部分可用c#编写,工程计算部分用APL 编写。特别要注意:这些语言要面向CLR。
 
       托管模块(managed module),就是一个标准的32位Microsoft Windows可移植执行体(PE32)文件,或者是一个标准的64位Microsoft Windows可移植执行体(PE32+)文件,它们都需要CLR才能执行。面向CLR的语言编写的源代码经过与之相关的编译器编译成一个与之对应的“ 托管模块”。
 
        托管模块的组成部分:
                    1:PE32或PE32+头:如果这个头使用PE32格式,文件只能在windows的32位或64位版本运行,如果使用PE32+格式,文件就只能在windows的64位版本运行。
       
                   2:CLR头:包含是这个模块成为一个托管模块的信息
 
                   3:元数据:每个托管模块都包含元数据表。主要有两种类型的表:一种类型的表描述源代码中定义的类型和成员;另一种类型的表描述源代码引用的类型和成员。
 
                   4:IL(中间语言)代码:编译器编译源代码生成的代码,在运行时,CLR将IL编译成本地CPU指令。
 
        将托管模块合并成程序集:
                  
                 CLR 实际不和托管模块一起工作,他是和程序集一起工作的。
 
                 程序集是一个或多个模块/资源文件的逻辑性分组,其次,程序集是重用、安全性以及版本控制的最小单元。既可以生成单文件程序集,也可以生成多文件程序集,取决于你对编译器或工具的选择。在CLR的世界中,程序集相当于一个“组件”。
 
         加载公共语言运行时:
 
                运行一个可执行文件时,windows会检查这个EXE文件的头,判断应用程序需要的是32 地址空间还是64位地址空间。具有PE32头的文件可在一个32位或64 位地址空间运行,具有PE32+头的文件则只能在一个64位地址空间运行,当然,windows还会检查头中嵌入的CPU架构信息,确保当前的计算机的CPU是否符合要求。
 
下表总结了两方面的信息:
 
             1:下表总结了为c#编译器指定不同的/platform命令行 开关时,会获得那种托管模块
 
              2:总结了应用程序在不同版本的windows上如何运行
 
 
 /platform开关  生成的托管模块  X86 windows  X64 Windows  IA64 Windows
 anycpu(默认)  PE32/不明确指定  32位应用程序  64位应用程序  64位应用程序
 x86  PE32/x86  32位应用程序  Wow64位应用程序 Wow 64位应用程序
 x64  PE32+/x64  不运行  64位应用程序  不运行
 Itanium  PE32+/ Itanium   不运行   不运行   64位应用程序
 
 
        windows检查好exe文件头,决定是创建32位,64位还是wow64 进程后,会在进程的地址空间中加载MSCorEE.dll的x86,x64或IA64版本。如果是x86版本,MSCorEE.dll的x86版本在c:\windows\system32目录中。如果windows的x64或IA64版本,MSCorEE.dll的x86版本在c:\Windows\SysWow64目录中,64位版本(x64或IA64)则在c:\Windows\System32目录中。然后,进程的主线程调用MSCorEE.dll中定义的一个方法。这个方法初始化了CLR,加载exe程序集,然后调用其入口方法(main),随即,托管的应用程序将启动并运行。
 
       与非托管代码的操作:
 
       1:托管代码能调用DLL中的非托管函数:托管代码可以采取一种名为P/Invoke的机制来调用DLL中包含的函数。
 
       2:托管代码可使用现有的com组件(服务器):例如,可以从一个c#应用程序中使用DirectX COM组件
 
       3:非托管代码可以使用托管类型(服务器):可以使用c#来创建一个ActiveX控件或者一个shell拓展。

本文出自 “我的地盘” 博客,谢绝转载!

你可能感兴趣的:(C#,clr)