安全联盟可信网站认证,制作静态网站制作,网站建设文化如何,网站做提示框文章部分引自《.NET4.0面向对象编程漫谈#xff08;基础篇#xff09;》第1章.NET面向对象编程基础#xff08;作者#xff1a;金旭亮#xff09; 无意间看到一位四五岁左右小朋友在玩斗地主#xff0c;总开始到结束#xff0c;她一直都在使用“提示”#xff08;托管基础篇》第1章.NET面向对象编程基础作者金旭亮 无意间看到一位四五岁左右小朋友在玩斗地主总开始到结束她一直都在使用“提示”托管出牌你猜的没错到最后她赢了。 那么你什么时候才会使用“托管”呢“我想继续游戏但是牌太烂了索性托管吧或者我想玩但是我会儿刚好有事需要处理” 实际上我们在选择了.NET Framework平台后就该选择使用什么语言了但是每种语言都有自己的优缺点例如在非托管C/C可对系统(Windows)进行一些很低的控制可以按照自己的想法管理内存控制线程当然这些事情你如果不想关心完全可以丢给CLR去处理它可以帮你处理的核心功能比如内存管理程序集加载安全性异常处理线程同步当然这些babyservice的待遇只能给托管的代码使用。 非托管应用程序的执行过程 首先看一下Windows操作系统执行一个普通程序即非托管程序的基本过程。 软件工程师写的程序经过编译器转为机器指令后一般以文件的方式保存在外部存储器中当CPU执行程序时要先把外部存储器中的程序指令代码读到内存。 内存被分成很多块称为内存单元每个内存单元都有一个唯一的地址指令就存放在以某个特定的地址开始的内存区域即若干个内存单元的集合中。保存要执行的第一条机器指令的那个内存单元就是程序的入口点Entry Point。 当程序执行时CPU从入口点取出第一条指令开始执行然后再取第二条依次类推…… 把一个程序从外部存储器上装入内存执行是一个复杂的过程这个功能由操作系统实现开发具体应用程序的软件工程师通常不需要手动去写这部分代码。 由此可知程序的运行必须依赖于操作系统如Windows而且编译器生成的程序文件包含的是仅适用于特定CPU架构的机器指令由于不同CPU架构的机器指令集不同所以这个可执行程序无法不加修改地在拥有不同CPU架构的计算机上运行。 以这种方式生成的机器指令代码称为非托管代码Unmanaged Code。非托管代码不仅不能在不同CPU架构的计算机上执行而且通常在不同的操作系统下也不能执行比如一个Windows应用程序就无法直接在 Linux下运行反之亦然这说明非托管代码的可移植性是受到较大限制的。 如果需要在拥有不同CPU架构的计算机和多种多样的操作系统上实现同一功能必须针对每种操作系统和CPU架构编写特定的代码这明显是一种重复且低效的劳动。 程序能不能只写一次到处运行 完全可以的这就是 跨平台的设计思想Java就是一个典范。.NET也采用了这种设计思想而且走得更远.NET在架构设计上不仅允许.NET应用程序在各种操作 系统和CPU架构上运行而且允许在同一个程序中混合使用由不同的编程语言开发出来的软件组件.NET的这一特性被称为跨语言。 要支持跨平台这一特性软件工程师编写的程序经过编译器生成的结果就不能是依赖于操作系统和特定CPU架构的机器指令了而必须是一种中立的、 在各种操作系统和CPU架构上都能执行的代码这种代码Java称为Byte Code字节码.NET称之为IL中间语言。 但程序最终还是要靠CPU执行的所以Java的字节码和.NET的IL代码仍然需要最终被翻译成本地CPU能执行的机器指令这部分功能由一个运行在特定操作系统之上的软件系统来完成这个软件系统被称之为虚拟机Virtual MachineVM。 图1-9 托管代码运行原理只需为每种操作系统和CPU架构提供一个虚拟机就可以让同样一个应用程序不加修改地跑在运行不同操作系统、拥有不同CPU架构的计算机上。 这种运行在虚拟机之上的代码被称为托管代码Managed Code其原理如图1-9所示。 使用C#编译器csc.exe编译生成的可执行程序实际包含的只是IL指令代码这是一种托管代码只能运行在.NET虚拟机之上。所以如果某台 计算机上没有安装.NET Framework就意味着图 1 9的虚拟机一层不存在.NET应用程序就无法执行。对于非Windows的操作系统只要上面有.NET虚拟机就可以运行.NET程序通常不需 要修改.NET应用程序源代码再重新编译。 一个应用程序可以只采用托管代码来构建完全依赖CLR以及.NET Framework类库也可以混合使用托管代码和非托管代码进行构建。托管代码调用非托管代码的技术在.NET中被称为平台调用Platform Invoke见图1-10。 点击查看大图图1-10 托管代码与非托管代码托管代码执行的过程 .NET下可直接运行的.exe文件包含的是IL指令。IL是微软和第三方编译器供应商磋商而创建的虚机器语言之所以说它是虚的是说它 独立于特定架构的CPU并且引入了许多具有面向对象特征的指令与传统的直接面向硬件的汇编指令有着很大的不同可以看成是面向对象的汇编指令。 由于IL指令独立于特定架构的CPU因此它必须经过一个翻译过程转换成本地CPU支持的机器指令才可以最终执行。这个翻译者就是JIT编译器Just-In-Time Complier请看图1-11。 如图1-11所示程序源代码经语言编译器生成程序集其中包含IL指令代码。当程序运行时类装载器Class Loader从外部存储器中将IL指令读入内存再经过JIT编译器动态地编译为本地CPU指令代码执行。在进行即时编译的过程中CLR同时检查这 些IL指令是否违反了一些安全规则必要时CLR会停止编译并中断程序的执行。 点击查看大图图1-11 托管代码的执行过程上述即时编译和代码验证的过程仅仅只是在第一次调用某个方法时发生。CLR会将编译好的本地代码缓存起来第二次调用时就直接调用缓存中的本地代码从而避免了再次编译所带来的性能损失。 当然这样的性能损失可以通过升级硬件设备来减少(避免)。 转载于:https://www.cnblogs.com/tymonyang/p/4455508.html