ASP.NET编程:[你必需晓得的.NET]第十四回:熟悉IL代码_从入手下手到如今仓酷云 ...
2003年中微软发布最新版本的ASP.netWebMatrix,对于我们喜欢用Asp.net来编程的朋友实在是个好消息,我也实实在在的将Asp.net更深入的研究了一下,以方便我以后更好的运用它,同时我也讲讲使用它的感受。系列文章目次索引:《你必需晓得的.NET》本文将先容以下内容:
·IL代码剖析办法
·IL命令剖析
·.NET进修办法论
<br>
1.弁言
自从『你必需晓得.NET』系列开篇以来,遭到人人良多的存眷和撑持,赐与我伟大的勉励和动力。俱往昔,我发明良多的园友都把眼光和核心注重在怎样了解IL代码这个成绩上。对我来讲,这真是个莫年夜的好动静,由于很分明我们的思绪渐渐的从使用向底层产生着变化,技能性的工具是一个方面的堆集,底层的探究在我以为也是必不成少的修炼。假如我们选择了来存眷这项修炼,那末我们就应当选择怎样来动手这项修炼,起首存眷『你必需晓得的.NET』系列能够给你供应一个捷径,少花一些工夫;其次对大家级的作品也应有更深切的懂得,如《AppliedMicrosoft.NETFrameworkProgramming》、《.NET实质论》;再次,就是像我一样从博客园和MSDN的常识库中不休的发展。呵呵,除给本人做了个告白以外,我以为不论是何种路子,懂得和熟悉IL代码,关于我们更深入的了解.NET和.NET使用之上的实质相对有纷歧样的劳绩,这也就是本文研讨和分享的来由。
那末,我们要懂得IL代码,就要晓得懂得IL的优点,工夫对每一个程序计划师来讲都是可贵的,你必需分明本人投资的代价再决意投进的本钱。关于.NET程序员来讲,IL代码意味着:
·通用的言语基本是.NET运转的基本,当我们对程序运转的了局有贰言的时分,怎样透过实质看外表,必要我们从实质动手来探究,这时候IL是你必需晓得的基本;
·元数据和IL言语是CLR的基本,懂得需要的两头言语是深切熟悉CLR的捷径;
·大批的事例剖析是以IL来揭密的,因而懂得IL是读懂别人代码的必备基本,能够给本人更多劳绩。
很分明这些优胜性足以勾引我们花工夫和精神浏览个中。但是,懂得了IL的优点,其实不意味着我们应当太过的来存眷IL,有人乃至能够味同嚼蜡的写一堆IL代码来完成一个复杂Helloworld程序,可是正如我们晓得的那样,程序计划已走过了几十年的开展,假如地道的沉醉在汗青中,除头脑欠好,没有其他的注释。否则瞥见任何代码都以IL的角度来剖析,又将走进另外一个误区,我们的主旨是寻求但不外分。
因而,有了上述了应当懂得的来由和不该该太过的基线,在摆正心态的条件下,本文入手下手以作者以为的体例来睁开对IL代码的熟悉,作者希冀经由过程本文的论述与剖析使得人人都能对IL有个概不雅之解,并在平常的项目理论中利用这类办法经由过程懂得本人的代码来懂得.NET。我想,这类办法应当是值得倡始和发扬的最好理论,不知你信不信呢?呵呵。
2.利用工具
俗语说,工欲善其事,必先利其器。IL的器次要就是ILadsm.exe和reflector.exe,这两个工具都是懂得IL的基本,其道理都是经由过程反射机制来检察IL代码。
·ILadsm.exe
翻开.NETFrameworkSKD命令提醒行,输出ildasm回车便可翻开,如图所示:
上图是我们熟习的《第十三回:从Hello,world入手下手熟悉IL》中的示例,个中的树形标记代表的意义,能够从MSDN的一张典范匡助示例来注释,以下图所示:
<br>
<br>
(图表MSDN)
·reflector.exe【下载】
Reflector是LutzRoeder开辟的一个让人镇静的反编译利器,今朝的版本是Version5.0.35.0,能够撑持.NET3.0,其功效也相称壮大,在利用上也较ILDASM加倍天真,如图所示:
能够便利的反编译为IL、C#、VB、Delphi等多种言语,是深切懂得IL的最好利器。
<br>
Reflector
在本文中我们以最复杂的ILadsm.exe为申明工具。
3.剖析布局
剖析IL布局,就参阅《第十三回:从Hello,world入手下手熟悉IL》,已有了大抵的先容,在此不必要举行过量的文字,实践上IL的自己的布局也不是很庞大,懂得了大抵的系统便可。
4.剖析经常使用命令
我们在懂得了IL文件布局的基本上,经由过程进修经常使用的IL命令,就能够基础上对IL到达了懂得不外分的尺度,因而对IL经常使用命令的剖析就是本文的重点和要点。我们经由过程对经常使用命令的注释、示例与剖析,慢慢懂得你生疏的言语天下本来也很复杂。
IL指令集包含了基本指令集和对象模子指令集也许有近200多个,对我们来讲消化这么多的生疏指令明显不是明智的举措,就行初级言语的关头字一样,我们只取其一瓢独饮,抓年夜放小的反动传统一样是无效的进修举措,具体的指令集注释请下载。
4.1newobj和initobj
newobj和intiobj指令就像两个兄弟,经常让我们利诱在其但是不知其以是然,固然熟悉可是不怎样分明,这类感到很忧郁,上面就让我们看看他们的事实:
代码引进
<br>
指令申明
<br>
深切剖析
从下面的代码中,我们能够得出哪些值得斟酌的结论呢?
MSDN给出的注释是:newobj用于分派和初始化对象;而initobj用于初始化值范例。
那末newobj又是怎样分派内存,完成对象初始化;而initobj又怎样完成对值范例的初始化呢?
明显,关于newobj指令,在《第五回:深切浅出关头字---把new说透》中,已有了必定的先容,复杂说来关于newobj我们有以下结论:
·从托管堆分派指定范例所必要的全体内存空间。
·在挪用实行机关函数初始化之前,起首初始化对象附加成员:一个是指向该范例办法表的指针;一个是SyncBlockIndex,用于举行线程同步。一切的对象都包括这两个附加成员,用于办理对象。
·最初才是挪用机关函数ctor,举行初始化操纵。并前往新建对象的援用地点。
而initobj的感化又能够小结为:
·机关新的值范例,完成值范例初始化。值得存眷的是,这类机关不必要挪用值范例的机关函数。详细的实行历程呢?以上例来讲,initobjMyStruct的实行了局是,将MyStruct中的援用范例初时化为null,而基元范例则置为0。
因而,值范例的初始化能够是:
//initobj体例初始化值范例
initobjAnytao.net.My_Must_net.IL.MyStruct
同时,也能够间接显现挪用机关函数来完成初始化,详细为
MyStructms=newMyStruct(123);
对应于IL则是对机关函数cto的挪用。
//挪用机关函数体例初始化值范例
callinstancevoidAnytao.net.My_Must_net.IL.MyStruct::.ctor(int32)
·Initobj还用于完成设定对指定存储单位的指针置空(null)。这一操纵虽不罕见,可是应当引发注重。
因而可知,newobj和initobj,都具有完成实例初始化的功效,可是针对的范例分歧,实行的历程有异。其区分次要包含:
·newobj用于分派和初始化对象;而initobj用于初始化值范例。因而,能够说,newobj在堆平分配内存,并完成初始化;而initobj则是对栈上已分派好的内存,举行初始化便可,因而值范例在编译期已在栈上分派好了内存。
·newobj在初始化过程当中会挪用机关函数;而initobj不会挪用机关函数,而是间接对实例置空。
·newobj有内存分派的历程;而initobj则只完成数据初始化操纵。
关于对象的创立,另有其他的情形值得注重,比方:
·Newarr指令用来创立一维从零肇端的数组;而多维或非从零肇端的一维数组,则仍由newobj指令创立。
·String范例的创立由ldstr指令来完成,详细的会商我们鄙人文来睁开。
4.2call、callvirt和calli
call、callvirt和calli指令用于完成办法挪用,这些恰是我们在IL中再熟习不外的几个伴侣。那末,一样是作为办法挪用,这几位又有何区分呢?我们起首对其做以归纳综合性的形貌,再来经由过程代码与实例,进进深切剖析层面。
·call利用静态调剂,也就是依据援用范例的静态范例来调剂办法。
·callvirt利用假造调剂,也就是依据援用范例的静态范例来调剂办法;
·calli又称直接挪用,是经由过程函数指针来实行办法挪用;对应的间接挪用固然就是后面的:call和callvirt。
但是,固然有以上的通用性结论,可是关于call和callvirt不成混为一谈。call在某种情形下能够挪用虚办法,而callvirt也能够挪用非虚办法。详细的剖析我们在今后的文章中来睁开,暂不做过量剖析。
5.结论
本文从几个重点的IL指令入手下手,力图经由过程对照性的剖析和深切来慢慢揭开IL的奥秘与利诱,正如我们在入手下手夸大的那样,本文只是个入手下手大概也是个阶段,对IL的寻找正如我本人的脚步一样,也在持续着,为的是在.NET的手艺天下可以有更多的意会。作者希冀经由过程不休的勉力渐渐和人人一同从IL天下寻找.NET天下,在今后的会商中我们间或的持续这个主题的不休发展。
[下载]
reflector.exe
IL指令速查手册
参考文献
(USA)JeffreyRichter,AppliedMicrosoft.NETFrameworkProgramming
(USA)DavidChappell,Understanding.NET
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。 市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。 我的意思是.net好用,从功能上来说比JAVA强还是很明显的。 主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。 主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。 碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
页:
[1]