- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
脱离IDE写程序
不用IDE写C#的Hello World
2011-11-21 14:10 zhangweiwen zhangweiwens Blog? HYPERLINK /art/201111/302870.htm \l commment \t _self 我要评论(0)?字号: HYPERLINK javascript:setfont(12); \t _self T?|? HYPERLINK javascript:setfont(16); \t _self T
用Visual Studio等IDE写C#的Hello World非常简单,但脱离了IDE你能不能打印出Hello World呢?这不是说工作时脱离IDE,而是学习一下CLR的执行模型.
AD:
用Visual Studio等IDE写C#的Hello World非常简单,但脱离了IDE你能不能打印出Hello World呢?这不是说工作时脱离IDE,而是学习一下CLR的执行模型.
Hello World
新建一个记事本,输入如下代码,另存为HelloWorld.txt.
using?System;? ?
namespaceHelloWorld? ?
{? ?
????classProgram? ?
???{? ?
????????static?voidMain(string[]?args)?{? ?
????????????Console.WriteLine(Hello?World!);? ?
????????????Console.ReadKey();? ?
????????}? ?
????}? ?
}?
打开Visual Studio 2008(2005,2010) 命令提示程序
却换到HelloWorld.txt的目录
运行命令:csc /out:Hello.exe HelloWorld.txt
如无意外,将会编译出Hello.exe,能打印出Hello World.
CLR执行模型-编译期
CLR程序的执行过程大致分为两步,编译期和运行期,编译期过程大致如下图:
其中编译期逻辑上也可分为两步:
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(); ?
}?
第一个WriteLine需要先JIT编译,再执行.而由于已编译WriteLine的代码,所以第二个WriteLine会直接执行内存块中的代码,跳过JIT编译.
由于分配内存,JIT编译过程等,所以程序会在第一次运行时造成一些性能损失,写ASP.NET时这种感觉特变明显,按了F5会等很久才会显示首页.
下面模拟感受这个过程.用一大堆类延长内存分配的时间,参考这个文件HelloWorld.css(博客园不支持txt格式):
再次运行命令:csc /out:Hello.exe HelloWorld.txt,得到Hello.exe,执行时发现有一定的延迟才会打印出Hello
文档评论(0)