1. 什么是托管代码(managed code)?

    托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:
    1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)
    2.托管代码编译为microsoft的平台专用语言。

    编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。

    托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机械码,然后会把编译好的机械码缓存起来,以备下次调用。(这就是即时编译)随着程序集的运行,运行库会持续地提供各种服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。

    Visual Basic .NET和C#只能产生托管代码。如果你用这类语言写程序,那么所产生的代码就是托管代码。如果你愿意,Visual C++ .NET可以生成托管代码。当你创建一个项目的时候,选择名字是以.Managed开头的项目类型。例如.Managed C++ application。

  2. 什么是非托管代码(unmanaged code)?

    非托管代码就是在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提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。托管代码就意味着托管数据?答案是否定的。

对于Visual Basic和C#来说,生活是简单的,因为你没有其它选择。当你在那些语言里面声明一个类,那么这个类的实例会在托管堆中被创建,垃圾收集器(GC)会帮我们管理这些对象的回收。但是在Visual C++中,你有另一个选择。即使你正创建一个托管程序,你可以决定哪些类是托管类型,哪些类是非托管类型的。

这就是非托管类型:

class Foo {    private:       int x;    public:       Foo(): x(0){}       Foo(int xx): x(xx) {} };

这就是托管类型

__gc class Bar {    private:       int x;    public:       Bar(): x(0){}       Bar(int xx): x(xx) {} };

他们唯一的区别就是类Bar的定义中有__gc关键字。这个关键字会给代码带来巨大的区别。

托管类型是可以被垃圾回收器所回收的。他们必须要用关键字new来创建,永远都不会在栈中出现。所以下面这行代码是合法的:

  Foo f;但是这一行代码就是非法的:Bar b;如果我在堆中创建一个Foo对象,那么我必须要负责清理这个对象:Foo* pf = new Foo(2);       // . . .       delete pf;

C++编译器实际上会用两个堆,一个托管堆和一个非托管堆,然后通过对new操作符的重载来实现对创建不同类型类的实例,分配不同的内存。如果我在堆里面创建一个Bar实例,那么我可以忽略它。当没有其他代码在使用它的时候,垃圾回收器会自动清理这个类,释放其占用的资源。 对于托管类型会有一些约束:它们不能实现多重继承,或者继承于非托管类型;它们不能用friend关键字来实现私有访问,它们不能实现拷贝构造函数。所以,你有可能不想把你的类声明为托管类型。但是这并不意味着你不想让你的代码成为托管代码。在Visual C++中,你可以选择。

托管代码与非托管代码的性能比较 :

基本上每个人都知道的是,所有.Net语言都将被编译成为一个叫做IL汇编的中间语言。但是计算机是如何执行这个中间代码的,却是很多人不知道,甚至理解错误了的。JIT是.NET程序运行的重要部件之一,全称是即时编译器。很多人(绝对不是少数,问了很多c++程序员,10个有9个这种想法)都以为JIT其实就是跟Java VM差不多的东西,是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码(也就是俗称的虚拟机)。但是事实上,.NET使用的是更为高级的技术。 .Net程序被加载入内存以后,当某段IL代码被第一次运行的时候,JIT编译器就会将这段IL代码,全部编译成本地代码,然后再执行。这也就是为什么.NET程序第一次运行都启动很慢的原因! 随.NET库,微软还附带了一个工具,可以事先将.NET程序所有的IL代码都编译成本地代码并保存在缓存区中,这样一来,这个程序就跟c++编译的一模一样了,没有任何区别,运行时也可以脱离JIT了(这里不要混淆了,这里不是说可以脱离.NET库,而是说不需要在进行即时编译这个过程了)。所以,请不要将.NET和Java混为一谈,两个的运行效率根本不是一个等级的!(java是多次运行时都解析,而.net是在第一次运行时解析后,以后执行的就是本机代码)

JIT的优化指的是可以针对本地CPU,在编译时进行优化。传统程序在编译时,为了保证兼容性,通常使用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的具体类型,可以充分利用这些附加指令集进行编译,这样的性能提升是很可观的。

由于以上的这个区别,会导致我们代码调试时的不同出现:
通常我们在vs中开发,在同一个解决方案下包含众多的不同项目。所以我们可能包含若干个C++项目,还有若干个C#项目,而C#和C++的 项目之间存在着互相调用的关系。这时如果在一个C++项目中调用了C#的项目接口或函数,调试时,如何从C++工程中调到C#工程中呢???
理解了上面的区别和差异大概就能明白这两种项目分别对应的是:C++是非托管代码,而C#是托管代码。
这时想要从C++工程中直接按照正常流程调试到C#工程中是需要工程属性进行设计才可以的。 代码调试时注意设置调试器类型:

  1. 托管代码的项目属性中调试页里,要把启用非托管代码调试前打勾。

  2. 非托管代码项目属性的调试页里,要把调试器类型设为混合。
    位置在:
    这样,就可以在托管和非托管代码之间进行调试了。

托管代码和非托管代码的介绍,以及在这区别下的混合调试方法相关推荐

  1. 托管代码与非托管代码

    什么是托管代码? 托管代码是一microsoft的中间语言,他主要的作用是在.NET   FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段 ...

  2. C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具...

    CLRInsideOut  托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具 http://download.csdn.net/source/2914818 转载于 ...

  3. 托管代码和非托管代码

    一.什么是"托管代码"? 1.1.托管代码     托管代码是使用可在 .NET 上运行的一种高级语言(例如 C#.Visual Basic.F# 等)编写的. 使用相应的编译器编 ...

  4. C#基础知识之托管代码和非托管代码

    什么是托管代码(managed code) 托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行.编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方 ...

  5. 托管代码和非托管代码的区别

    什么是托管代码? 托管代码是一microsoft的中间语言,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段: ...

  6. 托管代码与非托管代码之间与托管程序

    自.Net问世以后,我们习惯的VC++,VB编程模式有了很大的变换,托管与非托管的概念也不断映入程序员们的眼帘,可以说.NET正逐步成为编程的主流语言和平台之一.今天不与大家讨论谁主沉浮,也不发表慷慨 ...

  7. [转]托管代码与非托管代码

    什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET   FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是 ...

  8. .Net 托管代码和非托管代码的区别

    1.什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是 ...

  9. 托管代码与非托管代码之间的交互

    基础知识:如下所示: 1.在运行时控制下执行的代码叫做托管代码:在运行时之外执行的代码叫做非托管代码. 2.可以使用vs提供的dumpbin工具来获取动态链接库中提供的所有函数.如:dumpbin / ...

最新文章

  1. 不应该在ToString()方法中修改引用类型
  2. python:dataframe groupby后agg、apply、transfrom用法
  3. 取代C语言的标准输入输出:cin 和 cout【C++标准输入输出】
  4. 习题:统计字符串中的单词个数
  5. 外国经典儿童读物合集pdf_帮助父母在线购买儿童读物–用户体验案例研究
  6. WorkerMan 入门学习之(二)基础教程-Connection类的使用
  7. go ip过滤_用Go实现自己的爬虫
  8. ftp 工具_ftp,win7的ftp工具
  9. Linux ls按时间排列
  10. 批处理注释bat注释一行_注释和注释处理器入门指南
  11. Docker 学习笔记
  12. Centos7修改系统默认启动项
  13. 考勤记录查询java_kaoqin 一个员工考勤软件,用java和sql写的,实现基本的签到和查询功能 Develop 238万源代码下载- www.pudn.com...
  14. Stata基础:数据显示格式和四舍五入
  15. 基于java的扫雷游戏设计01
  16. unity3d-unet小demo
  17. 装系统时遇到的一些坑
  18. 程序员禅的10条法则
  19. 韩语计算机术语大全,韩语学习:韩语计算机、互联网术语 - 英语家园
  20. 世界上有两种公众号,我坚持做第二种

热门文章

  1. 初窥GPFS文件系统
  2. 06.面向对象、类、对象、构造方法及封装
  3. ftp软件,国内好用的ftp软件
  4. Microsoft365和普通Office之间有什么区别 如何选择?
  5. 首款一线大厂 QHD 萤幕手机快速体验, LG G3 动手玩(补上相机晴天拍摄效果) ...
  6. MapReduce例子——找出QQ共同好友
  7. 各种浏览器的缓存文件的位置和修改缓存目录的方法
  8. 设计模式之基础篇UML(类图)
  9. 计算机英文收集(一)
  10. 写给想成为前端工程师的同学们 —— 前端工程师是做什么的?