在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
用 Visual Studio等IDE写C#的Hello World非常简单,但脱离了IDE你能不能打印出Hello World呢?这不是说工作时脱离IDE,而是学习一下CLR的执行模型.
如无意外,将会编译出Hello.exe,能打印出Hello World. CLR执行模型-编译期CLR程序的执行过程大致分为两步,编译期和运行期,编译期过程大致如下图: 其中编译期逻辑上也可分为两步:
执行上面两步就可以得到一个XX.dll或XX.exe的程序集.就像上面的Hello.exe. 编译器如何知道要编译成托管模块还是资源文件?其实是必须明确告诉编译器每个文件的怎么编译,这个对应Visual Studio的文件属性的生成操作. 右击任何Visual Studio解决资源方案的文件-->属性-->生成操作: 指定Class1为嵌入的资源,用ILSpy查看会发现只是把Class1嵌入到程序集中,名称为:命名空间.文件名: 你甚至可以将一张图片设为编译让编译器试图去编译它,不过会报错. 运行期上面生成了程序集,程序集内的是IL代码,它还不是可运行的代码.IL是与CPU无关的机器语言.直到程序集被调用,才会由JIT(Just-in-Time,实时)编译器编译为本机代码(CPU指令).在运行时,CLR执行如下步骤:
程序集的可执行代码在需要的时候由JIT编译编译,然后本机代码(CPU指令)就被缓存以备后来的程序中执行.一旦应用程序终止,编译好的本机代码也会被丢弃. 例如如果将上面的代码改为: static void Main(string[] args) { Console.WriteLine("Hello"); Console.WriteLine("World!"); Console.ReadKey(); } 第一个WriteLine需要先JIT编译,再执行.而由于已编译WriteLine的代码,所以第二个WriteLine会直接执行内存块中的代码,跳过JIT编译. 由于分配内存,JIT编译过程等,所以程序会在第一次运行时造成一些性能损失,写ASP.NET时这种感觉特变明显,按了F5会等很久才会显示首页. 下面模拟感受这个过程.用一大堆类延长内存分配的时间,参考这个文件HelloWorld.css(博客园不支持txt格式): 再次运行命令:csc /out:Hello.exe HelloWorld.txt,得到Hello.exe,执行时发现有一定的延迟才会打印出Hello World. 生成本机代码使用.NET提供的NGen.exe,可以将IL代码编译成本机代码.可以解决上面的问题.NGen.exe有两个作用: 加快应用程序的启动速度.因为代码已编译为本机代码,运行时不需要再花时间编译 减少应用程序的程序集.如果一个程序集会同时加载多个进程.NGen.exe会将IL编译成本机代码,并保存到一个单独的文件中.这样就可以通过"内存映射"的方式,同时映射到多个进程中,使代码共享.避免每个进程一份代码. 再次运行Visual Studio 2008(2005,2010) 命令提示程序 运行如下命令:ngen install Hello.exe:
对于ASP.NET,Microsoft另外提供了aspnet_compiler.exe,我们可以在ASP.NET程序建一个脚本(.bat)预编译程序.以下是一个示例(from老赵的程序): %SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler -v / -p .\MyMvcDemo.Web.UI -f -errorstack .\Compliled
PAUSE
关于aspnet_compiler.exe不多介绍,感兴趣的可以自己搜索相关资料. The End. 参考: CLR via C# 第3版 C#图解教程 |
请发表评论