㈠ .NET reflector导出的一个个il文件要怎麼编译
http://msdn.microsoft.com/zh-cn/library/496e4ekx(VS.80).aspx空格后面加file就行了 补充:没看到类似的参数指令,你可以写个程序自动生成命令行,或者用MSBuild吧,那个可以指定文件夹
㈡ .net里的il 是什么的缩写,什么意思
一楼回答错误。IL是中间层语言上层代码编译完成后都要转换为中间语言供CLR使用IL为Intermediate Language有时候也叫Microsoft Intermediate Language中间语言使得在.Net中各种语言的方便交互成为了可能。
㈢ 精品赏析:一个.NET程序在编译和运行时都做了些什么
run-time)和运行原理 (CPU-specific binary or pseudo-code)的疑问。这里是一个简单的回答:当你编译一个C#应用程序或任何一种CLS(CommmonLanguage Specification)兼容的语言时,它将首先被编译成一种称为IL(Intermediate Language)的伪代码(pseudo-code)。在这个应用程序第一次被运行的时候,这种IL代码将被编译成机器代码,用于执行。也就是说从源代码到得到运行结果,进行了两次编译。事实上,只有那些被真正使用的函数代码才会被进行第二次编译。下面揭示开发过程中被隐藏起来的细节:1) 你用C#开发一些程序2) 用C#编译器或CLS兼容的编译器编译成EXE3) 编译器将生成的IL代码和附加信息(manifest)放入拥有一个标准PE头的Win32可执行文件的只读部分。4) 编译器在创建这个可执行文件时导入(import)一个名为_CorExeMain的函数。这个函数是.NET EE(execution engine)–.NET运行期引擎的入口函数。5) 当执行这个Win32可执行文件时,因为其主要是依赖于DLL的PE文件,操作系统将会调用位于MSCorEE.DLL中的_CorExeMain函数。6) 操作系统通过PE文件里的进入点,调用MSCorEE.DLL。并能保证在Windows里可以有很多程序同时运行。7) 因为操作系统不能执行.NET IL代码,EXE里的进入点只是简单的中介,它将指示操作系统调用_CorExeMain函数。8) 随后_CorExeMain函数开始解释位于PE文件中的IL代码。9) 因为IL是不能被直接执行的, .NET EE使用称为JITter (Just In Time compiler)这一即时编译过程只在第
㈣ 简述.net程序编译执行机制
.NET执行机制其实同抄很多的编袭程语言有一些不同。一般的高级程序语言会直接将代码编译成为机器语言,之后由本地机执行这些高效的机器代码从而实现编译过程。而.NET中的编译机制会在中间多一个环节,就是先将高级语言(如C#、VB)编译成为中间语言(IL),这些中间语言是.NET框架中所有的语言编译后的结果。这样说吧,比如我用C#、VB语言编写了两个类,编译之后的中间语言其实看起来是一样的,这就显示实现了.NET平台跨语言的这一事实。当然中间语言最终还是要编译成为机器代码以用于最终的本地机的运行。
㈤ 一文搞清到底什么是 NET
其实几句话就能搞清楚.net。我们知道我们使用C#/VB写的代码是源码,如果这个源码你写在记事本中也是一样的。然后使用csc.exe/vbc.exe把你的源码编译。生成的文件就是IL文件(可能为dll或exe后缀的)。事实上,我们如果在记事本写是一样的,这个记事本叫编辑器,你需要一句句地把代码写出来。如果我们记事本象notepad+一样能带一个高亮语法的标识多好?当然了,如果能有自动补全更好(一个关键词或声明的变量之类的,打出几个字母就提示出来,我们可以提高输入速度的,录入速度与打字速度这里有区别了,很多程序员以为自己输入速度很高,进而以为自己的打字速度很高,其实不是我经常说程序打字速度并不快不需要机械键盘就是因为这个,并不是说输入速度低),这些功能都加上,就是VS(vs其实是一个IDE,开发集成工具,而编辑器就是其中一个,智能感智——自动补全功能加强版,高亮显示等都是编辑器的插件被集成进来),而模板(自动给你增加using代码与部分文件名称等等)则是把常用的一些句子先给你输入好,等等集合起来,就把编辑这部分完成了。当然了,你安装完之后会看到类似于csc.exe与vbc.exe这类的编译器的,它可以把你的源码(文本)编译成IL语言。不幸的是csc/vbc的参数太多了,输出输入选项等等,谁也记不住啊,所以根据文本组织,自动生成一个csc参数使用的命令多好?嗯,想法不错的,这就是VS中另一个功能,他所谓有的编译F6等等都是按你的项目组织自动生成一条编译指令来调用编译器(csc编译c#的,vbc编译vb的),VS不但可以自已选择合适的编译器(根据后缀名),而且对于项目中某个参数,自动调用csc.好了,怎么把源码变成IL呢?这里要用到一个东西,我们叫.net framework,不要把framework理解成模板,不要以为你选择.net framework版本之后可以选择不同的模板,其实它才是把源码变成IL的标准——模板不同是因为针对于不同的语法糖进行不同的翻译。比如一个例子using语句块其实就是try-finally块,不同的framework中使用不同的类库与语法糖。换句话来说,开发中所增加的都是使用基本类库与语法糖的增加。比如.net framework 4.5中存在一个运算符,(?.)运算,它就会在.net framework 4.5时会映射到正确的IL语言。而在.net framework 4.0中却不会认识该运算符。当然了 vari?.Attribute1与.net framework 4.0中vari==null?null:vari.Attribute1的结果是一样的。虽然.net framework 4.5比4.0增加了不少的东西,它其实只是方便了你写的源码,IL指令并没有任何的增加!所以呢每当.net framework版本增加时,其实只变化了一些我们编码时的语法或语法糖而已!并附带送给我们几个模板或新开发几个模板而已。比如MVC/web api等等模板。说完了生成,现在再说一下IL是怎么运行的,IL其实并不能直接运行,我们需要一个标准把IL再"映射“成可运行的二进制(机器语言),源码”映射“成IL使用的是.net framework,而IL映射成二进制需要的是.net,不同的是我们把源码”映射“IL叫编译,使用的是.net framework,也叫编译态,而IL映射成二进制并运行,这个叫运行态。所以我们称两个的区别一个叫开发环境,一个叫运行环境。如果按照正常的理解,其实我们一个用的是.net framework 4.X,运行时我们安装的dotnet4f,是运行环境。运行环境的虚拟机就是为了把IL映射成二进制(Native Image),而且我们会保存起来,当然了,下次使用相同的IL时,直接使用Native Image中已保存的,不再执行翻译了,这个就是运行时的机制。大多数时间很多人把开发环境与运行环境弄混了,为什么呢?因为我们开发时避免不了要测试及运行,所以开发环境包含了运行环境(你安装.net framework时同时会安装运行环境),而不需要开发的人员比如如使用windows 10中已经安装了部分的.net 运行环境支持,所以他们也不需要了解这个东西。只在在出现类似.net framework 4.0在vista版本中运行时,就需要给vista非开发机安装.net framework运行版本。否则不需要。所以很多人把开发环境与运行环境混在一起理解了。事实上,.net framework 2.0/3.5开发的软件,生成了IL标准都是2.0的,所以我们只需要2.0的运行环境。而.net 4.0及4.x.y都使用的是.net 4.0的运行环境。说白了,.net有开发版本,而framework相当于编译时使用的标准。而IL的标准则是MSIL,也叫是我们常说的CLS,而把运行态叫CLR(公共语言运行时)是虚拟机要执行的标准。所以,其概况非常简单,.net支持多种语言,多种语言都是可以生成IL依赖于不同的编译器,比如csc/vbc等。可以让不同的语言开发者在同平台下工作。而IL(中间语言)再由虚拟机在不同的机器上翻译成不同的机器语言,保证了其移植性。包括现在支持的linux新标准也是如此方式。跨平台则使用是native image方式。分清这两个步骤,那么.net就没有什么神密的了。告诉你几个事实,有助于理解问题。C#生成的IL可以被反射成VB语法!当然反向也可以!Red gate的reflector已被MS收购。可以试试的,原来的ILDism已被基本放弃了!它是早期做为VS的插件工具出现的。当然ILSpy也是不错的,那只是一个反射工具而已。请细想为什么C#生成的IL可以反射成VB语言(反射的准确度与各家软件的功能有一定的关系)00.net framework 4.0的生成的IL可以被反射成4.7.2的语法!想想这是为什么?如果你运行环境与编译环境搞混的话,假定IL中也有4.7.2的运行环境,那么怎么可能版本之间相互反射?但是,.net 2.0生成的IL反射成.net 4.0会存在问题,.net 4.0生成的IL反射成2.0会会现很多错误!其实.net 4.0并不包含.net 2.0的语法集,所以这两个运行版本并不兼容,反射软件只会把相同的部分反射出来,不同的部分就难以反映了!.net 2.0反射4.0的结果要好点,这是因归功于.net framework为了降低学习成本,有一定的连续性,但是这种连续性在高版中部分.开发使用的C#语法被放弃(放弃与清除是不同的,放弃还能反射出来,清除的却无法再反射了)。搞清这些就能搞清楚.net的两段三步(两段开发段/运行段,三步,源码语法(C#/VB),IL语法(MSIL), 二进制(可运行的机器语言))。
㈥ .NET 解释术语:CLR、FCL、IL、Assembly(程序集) 简述.NET Framework的架构及各模块主要功能
CLR常用简写词语,CLR是公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。.net框架中包括有一组.net框架类库(Framework Class Library,简称FCL)程序集,其中含 有几千个类型的定义,每个类型都提供了某种功能。IL又称为(interpretative language 解释语言),我们.NET开发人员必定离不开IL,就算您没有学习,也一定可以在各处看到它的身影。而且IL也是.NET唯一懂得的语言,我们每天其实都在使用着ILIL是中间层语言上层代码编译完成后都要转换为中间语言供CLR使用IL为Intermediate Language有时候也叫Microsoft Intermediate Language中间语言使得在.Net中各种语言的方便交互成为了可能。assembly, 这里把它翻译为配件, 以示和组件(Component)加以区别. 一个配件有时候是指一个EXE或者DLL文件, 实际上是一个应用程序(就是指带有主程序 入口点的模块)或者一个库文件. 但是配件实际上可以是由一个或者多个文件组成 (dlls, exes, html等等), 代表一组资源, 以及类型的定义和实现的集合. 一个配件也可 以包含对其它配件的引用. 所有这些资源、类型和引用都在一个列表(manifest)中描述?nbsp;U飧鳇anifest也是配件的一部分,所以配件是一个自我描述的,不需要其它附加的部件 对其描述!配件的另一个重要特性是,它是.Net环境下类型标识的一部分,也可以说 是基本单位。因为,区分一个类型的标识就是包含这个类型的配件名字加上类型名本身。 举个例子,配件A定义了类型T, 配件B也定义了同名类型T,但是.Net把这两个类型认为是 不同的类型。 注意,不要把配件(assembly)和名字空间(namespace)混淆起来。其实 名字空间仅仅是用来把类型名用树的形式组织起来的手段。对于运行是环境来讲,类型名 就是类型名,和名字空间一点关系都没有。 总之,记住配件名加上类型名唯一标识一个 运行时类型。 另外,配件也是.Net框架用于安全策略的基本单位,许多安全策略都是 基于配件的。
㈦ net il为什么能反编译出整个dll
to flashthunder(闪雷) Reflector for .NET 下载地址:http://www.aisto.com/roeder/dotnet/to gzheng23()1.下载Reflector.FileDisassembler.zip,解压后得到一些文件,其中Reflector.FileDisassembler.dll是已经编译好的,其它是它源码;2.打开Reflector,在view菜单下的Add-Ins,将Reflector.FileDisassembler.dll添加到里面;3.open一个dll,exe,或mcl为后缀的文件,当然要支持.net的4.选择要反编译的dll(会在列表中显示),选择Tools->File Disassembler,在右窗口会出现设置存放源码位置的路径,点击产生就可以了!
㈧ ,net中什么是IL 文件谢谢。
跨平台跨语言的中间语言,介于程序员编写的那种代码,与最终执行时生成的机器码之间。具有一定的可读性,可以反编译