标签:变量类型 code 不能 microsoft 电脑 delete work compiler 经历
一般App(应用程序)编译过程
.NET App(应用程序)编译过程
2.理解什么是CIL?
CIL:在编译使用.NET Framework库的代码时,不是立即创 建专用于操作系统的本机代码,而是把代码编译为通 用中间语言(Common Intermediate Language)。这些代码并非专门用于任何一种操作系统,也非专门 用于C#及其他.NET语言,如Visual Basic .NET也可以在第一阶段编译为这种语言, 开发C#应用程序时,这个 编译步骤由IDE完成。
3.理解什么是程序集?
在编译应用程序时,所创建的CIL代码存储在一 个程序集中。程序集包括可执行的应用程序文件(exe)和其他应用程序使用的库(dll)
程序集包含了两种文件:可执行文件(.exe文件)和 类库文件(.dll文件)。
在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集。
应用程序结构:包含 应用程序域(AppDomain),程序集(Assembly),模块(Module),类型(Type),成员(EventInfo、FieldInfo、 MethodInfo、PropertyInfo) 几个层次。
他们之间是一种从属关系,也就是说,一个AppDomain能够包括N个Assembly,一个Assembly能够包括N个Module,一个Module能够包括N个Type, 一个Type能够包括N个成员。他们都在System.Reflection命名空间下。
从【应用程序结构】中不难看出程序集Assembly的组成:
4.理解什么是JIT编译器?
JIT:JIT编译器,英文写作Just-In-Time Compiler,中文意思是即时编译器。JIT编译器能够将CIL编译成为各种不同的机器代码,以适应对应的系统平 台,最终使得程序在目标系统中得到顺利地运行。
5.理解什么是托管代
托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行。编译器把代码编译成中间语言,当方法被调用时,CLR 把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。随着程序集的运行,CLR提供各种 服务:内存管理,安全管理,线程管理,垃圾回收,类型检查等等。
托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代 码充当着翻译的作用,源代码在运行时分为两个阶段:
1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)
2.托管代码编译为microsoft的平台专用语言。
编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。
什么是非托管代码(unmanaged code)?
非托管代码,直接编译成目标计算机码,在公共语言运行库环境的外部,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。如需要内存管理等服务,必须显示调用操作系统的接口,通常调用Windows SDK所提供的API来实现内存管理。
当项目选择名字以MFC,ATL,Win32开头的项目类型,那么这个项目所产生的就是非托管程序。
托管代码和非托管代码的区别:
1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。
2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。
6.掌握创建.NET应用程序所经历的步骤
理解C#应用程序代码、程序集、本机代码、EXE文件DLL库、编译、JIT编译器、托管的CLR环境
7.理解什么是元数据?
元数据:是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述。将您的代码编译为 PE 文件 时,便会将元数据插入到该文件的一部分中,而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中。在模块或程序集中定义和引 用的每个类型和成员都将在元数据中进行说明。当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。
元数据存储一下信息:
8.理解什么是中间语言?
首先说下C#中的变量类型吧,C#中有2个变量类型,一种是值类型,一种是引用类型,值类型是在栈上创建,这一类型用不到GC,引用类型是在堆中创建,GC主要是在这里管理对象。GC对每个对象有个引用计数,所有说只要有变量在引用它,计数器就不为了,一个变量不再引用这个对象,对象的计数器就减一,知道计数器为0时,对象就成为内存垃圾了(没有变量引用它),但是此时垃圾并没有回收。
.NET的GC机制有这样两个问题:
首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。
GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序 员显式调用以释放非托管资源。使用using语句可以简化资源管理。
在内存占用超过一定限度时,GC才启动,释放垃圾资源,说白了就是delete这些对象,将内存空间归还给系统。但是这还没完,空间释放后,内存空间就不连续了,所有GC还要干一件事,就是将空间整理下,将占用的空间连续化,具体说就是将空间向上推,就是想高地值转存,这样空间就连续了,使用也方便了,然后GC就改变应用那些对象的变量里地地址,让他们指向正确的位置,所以说C#中的引用类型就是一种指针,一种动态改变值的指针。
9.理解CLR、CIL、CTS、CLI、BCL、FCL代表含义
标签:变量类型 code 不能 microsoft 电脑 delete work compiler 经历
原文地址:https://www.cnblogs.com/WangBingChao/p/14417973.html