托管代码和非托管代码
一、什么是“托管代码”?
1.1、托管代码
托管代码是使用可在 .NET 上运行的一种高级语言(例如 C#、Visual Basic、F# 等)编写的。 使用相应的编译器编译以这些语言编写的代码时,无法获得机器代码, 而是获得 中间语言 代码,然后运行时会对其进行编译并将其执行。 C++ 是这条规则的一个例外,因为它也能够生成可在 Windows 上运行的本机非托管二进制代码。
简而言之,托管代码就是执行过程交由运行时管理的代码; 在这种情况下,相关的运行时称为公共语言运行时 (CLR),不管使用的是哪种实现(例如 Mono、.NET Framework 或 .NET Core/.NET 5+)。 CLR 负责提取托管代码、将其编译成机器代码,然后执行它。 除此之外,运行时(CRL)还提供多个重要服务,例如自动内存管理、安全边界、类型安全,等等。
中间语言(IL)代码在公共语言运行库(CLR)中运行;编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。
托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:
- 源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)
- 托管代码编译为microsoft的平台专用语言
编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。
托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机械码,然后会把编译好的机械码缓存起来,以备下次调用。(这就是即时编译)随着程序集的运行,运行库会持续地提供各种服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
Visual Basic .NET和C#只能产生托管代码。如果你用这类语言写程序,那么所产生的代码就是托管代码。如果你愿意,Visual C++ .NET可以生成托管代码。当你创建一个项目的时候,选择名字是以.Managed开头的项目类型。例如.Managed C++ application。
1.2、中间语言和执行
什么是“中间语言”(简称 IL)? 中间语言是编译使用高级 .NET 语言编写的代码后获得的结果。 对使用其中一种语言编写的代码进行编译后,即可获得 IL 所生成的二进制代码。 必须注意,IL 独立于在运行时顶层运行的任何特定语言;行业甚至为它单独制定了规范,如果有需要,你可以阅读该规范。
从高级代码生成 IL 后,你很有可能想要运行它。 CLR 此时将接管工作,启动 实时 (JIT) 编译过程,或者将代码从 IL 实时 编译成可以真正在 CPU 上运行的机器代码。 这样,CLR 就能确切地知道代码的作用,并可以有效地 管理 代码。
中间语言有时也称为公共中间语言 (CIL) 或 Microsoft 中间语言 (MSIL)。
二、什么是非托管代码(unmanaged code)
非托管代码,直接编译成目标计算机码,在公共语言运行库(CLR)环境的外部,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。如需要内存管理等服务,必须显示调用操作系统的接口,通常调用Windows SDK所提供的API来实现内存管理。
当项目选择名字以MFC,ATL,Win32开头的项目类型,那么这个项目所产生的就是非托管程序。
非托管代码就是在Visual Studio .NET 2002发布之前所创建的代码。例如Visual Basic 6, Visual C++ 6, 最糟糕的是,连那些依然残存在你的硬盘中、拥有超过15年历史的陈旧C编译器所产生的代码都是非托管代码。托管代码直接编译成目标计算机的机械码,这些代码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理等。如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常来说,它们会调用Windows SDK所提供的API来实现。就最近的情况来看,非托管程序会通过COM接口来获取操作系统服务。
跟Visual Studio平台的其他编程语言不一样,Visual C++可以创建非托管程序。当你创建一个项目,并且选择名字以M FC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。
三、托管代码和非托管代码的区别
1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。
2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。
四、托管代码与非托管代码的性能比较
基本上每个人都知道的是,所有.Net语言都将被编译成为一个叫做IL汇编的中间语言。但是计算机是如何执行这个中间代码的,却是很多人不知道,甚至理解错误了的。JIT是.NET程序运行的重要部件之一,全称是即时编译器。很多人都以为JIT其实就是跟Java VM差不多的东西,是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码(也就是俗称的虚拟机)。但是事实上,.NET使用的是更为高级的技术。 .Net程序被加载入内存以后,当某段IL代码被第一次运行的时候,JIT编译器就会将这段IL代码,全部编译成本地代码,然后再执行。这也就是为什么.NET程序第一次运行都启动很慢的原因! 随.NET库,微软还附带了一个工具,可以事先将.NET程序所有的IL代码都编译成本地代码并保存在缓存区中,这样一来,这个程序就跟c++编译的一模一样了,没有任何区别,运行时也可以脱离JIT了(这里不要混淆了,这里不是说可以脱离.NET库,而是说不需要在进行即时编译这个过程了)。所以,请不要将.NET和Java混为一谈,两个的运行效率根本不是一个等级的!
JIT的优化指的是可以针对本地CPU,在编译时进行优化。传统程序在编译时,为了保证兼容性,通常使用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的具体类型,可以充分利用这些附加指令集进行编译,这样的性能提升是很可观的。
五、代码编译执行流程
什么是托管代码? | Microsoft Docshttps://docs.microsoft.com/zh-cn/dotnet/standard/managed-code
托管代码和非托管代码的区别_代码托管_DevCloud_华为云论坛 (huaweicloud.com)https://bbs.huaweicloud.com/forum/thread-126526-1-1.html
托管代码和非托管代码相关推荐
- 托管代码与非托管代码
什么是托管代码? 托管代码是一microsoft的中间语言,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段 ...
- C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具...
CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具 http://download.csdn.net/source/2914818 转载于 ...
- C#基础知识之托管代码和非托管代码
什么是托管代码(managed code) 托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行.编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方 ...
- 托管代码和非托管代码的区别
什么是托管代码? 托管代码是一microsoft的中间语言,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段: ...
- 托管代码与非托管代码之间与托管程序
自.Net问世以后,我们习惯的VC++,VB编程模式有了很大的变换,托管与非托管的概念也不断映入程序员们的眼帘,可以说.NET正逐步成为编程的主流语言和平台之一.今天不与大家讨论谁主沉浮,也不发表慷慨 ...
- [转]托管代码与非托管代码
什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是 ...
- .Net 托管代码和非托管代码的区别
1.什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是 ...
- 托管代码与非托管代码之间的交互
基础知识:如下所示: 1.在运行时控制下执行的代码叫做托管代码:在运行时之外执行的代码叫做非托管代码. 2.可以使用vs提供的dumpbin工具来获取动态链接库中提供的所有函数.如:dumpbin / ...
- 托管代码和非托管代码的介绍,以及在这区别下的混合调试方法
什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托 ...
最新文章
- 2022-2028年中国新零售行业深度调研及投资前景预测报告(全卷)
- angular模拟web API
- DNS解析原理与Bind部署DNS服务
- Android N 多窗口模式,你需要知道的一切
- python 指定gpu_加快Python算法的四个方法:Numba篇
- Iocomp控件教程之LinearGauge--线性刻度尺控件
- 什么是PLC的响应时间
- 霹雳吧啦Wz语义分割学习笔记P10
- ssm银行账户管理系统毕业设计(附源码、运行环境)
- iphone3GS iOS6.0.1不完美越狱详细图文教程
- 经典点云配准算法:迭代最近点算法ICP(Iterative Closest Point)
- 重置计算机网络设置路由器,路由器怎样重新设置_路由器重新设置怎么弄-系统城...
- linux连接蓝牙没声音,Linux Ubuntu18.04蓝牙没声音 org.bluez.Error.Failed, name org.PulseAudio1 already taken...
- 网络发现已关闭网络计算机和设备不可见
- Elasticsearch:如何使用 Elasticsearch 和 Python 构建面部识别系统
- 去除bootstrap的table样式中单元格边框线
- 大学计算机基础模拟试题
- 修改.lnk文件的后缀
- Chino with Rewrite
- 在项目中单元测试是用来做什么的?
热门文章
- 远程锁定计算机,利用Microsoft帐户来远程退出并锁定你的Windows 10电脑
- matlab因子载荷矩阵正交旋转,因素分析中的矩阵旋转
- 【Python入门教程】第15篇 if条件语句
- 嵌入式桌面操作系统使用与制作攻略
- 人人车否认破产称地方经营型模式升级为合伙人模式
- 利用F检验来检验自变量与因变量之间的关系能否用一个线性回归模型来表示
- 深海迷航显示无法连接服务器,深海迷航中管道怎么连接 | 手游网游页游攻略大全...
- 如何处理工作中同事的吝于赐教?
- 原创 【我的OpenGL学习进阶之旅】介绍一下OpenGL ES的 遮挡查询
- 2020年中国地理信息产业产值或达万亿元