托管代码、非托管代码

来源:百度文库 编辑:神马文学网 时间:2024/04/20 01:21:04
请大家讨论下,托管代码和非托管代码的区别,谢谢!
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:32
  • vrhero
  • (若批评不自由则赞美无意义...)
  • 等 级:
#1楼 得分:10回复于:2009-02-28 22:40:16 这还需要讨论吗?由CLR执行的代码就是托管代码...反之就是非托管代码,非托管代码由操作系统直接执行...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:div+css和table布局的讨论,欢迎拍砖!
  • vrhero
  • (若批评不自由则赞美无意义...)
  • 等 级:
#2楼 得分:0回复于:2009-02-28 22:41:56 另外托管代码和非托管代码目前都是.NET才有的术语...也可以把所有本机代码都叫非托管代码...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:你排斥微软的服务器控件吗?
  • Dobzhansky
  • (Gecko - 么个?则个!)
  • 等 级:
#3楼 得分:10回复于:2009-02-28 22:42:10 托管代码 交给 一个虚拟机(比如微软的CLR, mono 的叫啥?), 虚拟机翻译成 cpu 认识的代码执行
非托管代码直接交给 CPU 执行.
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:Gridview用法大总结(牛年珍藏版) [代码分享]
  • Dobzhansky
  • (Gecko - 么个?则个!)
  • 等 级:
#4楼 得分:10回复于:2009-02-28 22:45:11 .net 规范里头描述了一个
VES (Virtual Execution System)

微软的实现叫 Microsoft Common Language Runtime(CLR)
是运行在 windows 平台上的.
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:如何以派生类名作为参数,在另一个类中实例化父类成员
  • jscn123789abc
  • (aaa)
  • 等 级:
#5楼 得分:0回复于:2009-02-28 23:31:28 谢谢楼上朋友的回复,细节问题还是挺多的...

最近调试一些程序总是因为委托使用不当,
导致系统崩溃,提示托管代码方面的错误提示...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:对一个字符串里的字母倒序,别的字符保持原位不变?
  • agentianle
  • (天乐)
  • 等 级:
#6楼 得分:10回复于:2009-03-01 00:25:35 托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • hangang7403
  • (学习者)
  • 等 级:
#7楼 得分:2回复于:2009-03-01 08:24:58 up
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • LJH20002004200820131
  • (刘旒)
  • 等 级:
#8楼 得分:2回复于:2009-03-01 08:30:57 up一个
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • amandag
  • (高歌)
  • 等 级:
  • 2

    更多勋章
#9楼 得分:2回复于:2009-03-01 08:32:16 这种基础概念还是看看书更好
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • yuanmanguo
  • (godogoflive)
  • 等 级:
#10楼 得分:10回复于:2009-03-01 08:43:02 在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • yuanmanguo
  • (godogoflive)
  • 等 级:
#11楼 得分:10回复于:2009-03-01 08:43:24 公共语言运行库概述 
编译器和工具公开运行库的功能并使您能够编写受益于此托管执行环境的代码。使用针对运行库的语言编译器开发的代码称为托管代码;使用托管代码有很多好处,因为它具有诸多功能,如跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。 

若要使运行库能够向托管代码提供服务,语言编译器必须发出对代码中的类型、成员和引用进行描述的元数据。元数据与代码一起存储;每个可加载的公共语言运行库可移植可执行 (PE) 文件都包含元数据。运行库使用元数据完成以下任务:查找和加载类,在内存中对实例进行布局,解析方法调用,生成本机代码,强制安全性,以及设置运行时上下文边界。 

运行库自动处理对象布局和管理对对象的引用,当不再使用对象时释放它们。其生存期以这种方式来管理的对象称为托管数据。垃圾回收消除了内存泄漏以及其他一些常见的编程错误。如果代码是托管的,则可以在 .NET Framework 应用程序中使用托管数据、非托管数据或者使用这两者。由于语言编译器提供它们自己的类型(如基元类型),因此可能并不总是知道(或需要知道)数据是否是托管的。 

公共语言运行库使设计其对象能够跨语言交互的组件和应用程序变得很容易。用不同语言编写的对象可以互相通信,并且它们的行为可以紧密集成。例如,可以定义一个类,然后使用不同的语言从原始类派生类或调用原始类的方法。还可以将类的实例传递到用不同的语言编写的类的方法。这种跨语言集成之所以成为可能,是因为针对运行库的语言编译器和工具使用由运行库定义的通用类型系统,而且它们遵循运行库关于定义新类型以及创建、使用、保持和绑定到类型的规则。 

所有托管组件都携带有关生成所基于的组件和资源的信息,作为其元数据的一部分。运行库使用这些信息确保组件或应用程序具有它需要的所有内容的指定版本,这使代码不太可能由于某些未满足的依赖项而中断。注册信息和状态数据不再保存在注册表(在注册表中建立和维护它们会很困难)中。相反,有关您定义的类型(和它们的依赖项)的信息作为元数据与代码存储在一起,这样大大降低了组件复制和移除任务的复杂性。 

语言编译器和工具按照对于开发人员来说有用而直观的方式来公开运行库的功能。这意味着运行库的某些功能可能在一个环境中比在另一个环境中更引人注意。您对运行库的体验取决于您使用的语言编译器或工具。例如,如果您是一位 Visual Basic 开发人员,您可能会注意到有了公共语言运行库,Visual Basic 语言的面向对象的功能比以前多了。下面是运行库的一些优点: 

性能改进。 
能够轻松使用用其他语言开发的组件。 
类库提供的可扩展类型。 
新的语言功能,如面向对象的编程的继承、接口和重载;允许创建多线程的可缩放应用程序的显式自由线程处理支持;结构化异常处理和自定义属性支持。 
如果使用 Microsoft® Visual C++® .NET,则可以使用 C++ 托管扩展来编写托管代码。C++ 托管扩展提供了托管执行环境以及对您所熟悉的强大功能和富于表现力的数据类型的访问等优点。其他运行库功能包括: 

跨语言集成,特别是跨语言继承。 
垃圾回收,它管理对象生存期,使引用计数变得不再必要。 
自我描述的对象,它使得使用接口定义语言 (IDL) 不再是必要的。 
编译一次即可在任何支持运行库的 CPU 和操作系统上运行的能力。 
还可以使用 C# 语言编写托管代码。C# 语言提供了下列优点: 

完全面向对象的设计。 
非常强的类型安全。 
很好地融合了 Visual Basic 的简明性和 C++ 的强大功能。 
垃圾回收。 
类似于 C 和 C++ 的语法和关键字。 
使用委托而不是函数指针,从而增强了类型安全和安全性。函数指针通过 unsafe C# 关键字和 C# 编译器 (Csc.exe) 的 /unsafe 选项可用于非托管代码和数据。 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • wuyq11
  • (人生如梦)
  • 等 级:
  • 2

    16

    3

    更多勋章
#12楼 得分:10回复于:2009-03-01 08:53:36 托管代码是指用.net framework支持的语言写的代码。.net framework为了让这些代码可以执行,提供了数个核心运行服务,因此这些代码必须向CLR提供最基本的信息,这些信息就叫做“元数据”。
执行效率
http://www.cnblogs.com/wuchang/archive/2006/12/07/584997.html
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • JaggerLee
  • (在山的那边海的那边有一群程序员)
  • 等 级:
#13楼 得分:10回复于:2009-03-01 09:02:38 托管代码相当于 java 的字节码,也就是 javac 之后的文件

非托管代码相当于 本机CPU指令序列


.NET 的 CLR 相当于Java解释器


  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • gjl_gjl
  • (Java?.net?)
  • 等 级:
#14楼 得分:2回复于:2009-03-01 09:21:26 学习啊~
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • wangping_li
  • (总有一天,我星球上的人会来接我)
  • 等 级:
#15楼 得分:10回复于:2009-03-01 11:00:27 这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍


托管代码 (managed code) 
  由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。 
  托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。 
  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。 

非托管代码 (unmanaged code) 
  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • heart_string
  • 等 级:
#16楼 得分:2回复于:2009-03-01 11:06:25 可以举个例子不?
什么样的代码是托管代码?
什么样的代码是非托管代码?
这个问题我也不清楚,还望大虾们指教!
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • yagebu1983
  • (丐帮帮主)
  • 等 级:
#17楼 得分:0回复于:2009-03-01 11:10:51 讲的都很详细啊。。。
up。。。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • jscn123789abc
  • (aaa)
  • 等 级:
#18楼 得分:0回复于:2009-03-01 23:40:53 谢谢楼上朋友的回复,分析的很深入...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • jscn123789abc
  • (aaa)
  • 等 级:
#19楼 得分:0回复于:2009-03-15 18:51:36 谢谢楼上朋友的回复....
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • Wind_08
  • (brook)
  • 等 级:
#20楼 得分:0回复于:2009-03-15 19:05:52
引用 15 楼 wangping_li 的回复:
这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍


托管代码 (managed code)
  由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
  托管代码是可以使用20多种支持Microsoft…


学习
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • typeof
  • (null)
  • 等 级:
#21楼 得分:0回复于:2009-03-15 19:50:49 学习。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • fanbo
  • (天天编程)
  • 等 级:
#22楼 得分:0回复于:2009-03-15 19:54:18 不明白,学习,要分
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • Jueyoung
  • (早上可以吃鸡蛋, 喝粥了!)
  • 等 级:
#23楼 得分:0回复于:2009-05-26 09:15:11 收藏了
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • jscn123789abc
  • (aaa)
  • 等 级:
#24楼 得分:0回复于:2009-05-26 23:35:49 ding...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • start55
  • (start55)
  • 等 级:
#25楼 得分:0回复于:2010-01-18 23:34:23 学习 ,接分
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • fengqipiaobo
  • (风起漂泊)
  • 等 级:
#26楼 得分:0回复于:2010-06-25 21:57:15 学习了!
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • niit_zc
  • (绝对零度)
  • 等 级:
#27楼 得分:0回复于:2010-07-15 15:17:09 学习!
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • laichunlin
  • (小赖)
  • 等 级:
#28楼 得分:0回复于:2010-07-30 15:42:58 分析的很好,学习
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • xiatiandetonghua
  • (xiatiandetonghua)
  • 等 级:
#29楼 得分:0回复于:2010-08-15 15:44:43 深入学习
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • handong520
  • (寒冬)
  • 等 级:
#30楼 得分:0回复于:2010-10-03 11:57:07 在公共运行时之外执行的代码被称为非托管代码,例如:常见的COM组件、ActiveX控件和Win32 API函数等都是非托管代码.
区别如下
代码模型:非托管代码通过接口来进行通信,百托管代码则不必经过接口,而是直接传递数据;
错误处理机制:COM方法通常返回HRESULT,表示调用成功还是失败。托管代码是通过一场机制来进行错误处理;
标识:GUID标识特定的非托管类型,但并不是提供类型的位置信息。托管类型的名称不但包含类型名,而且还包含唯一的程序集名称。因为程序集名唯一的标识类型,所以可以跨越多个程序集来重用某一类型名称;
类型定义:COM组件的类型库只包含公共类型,并且是可选的。在托管编程模式中,类型信息对于所有类型来说都是强制性的。互操作服务提供了用于将类型库转换为程序集中的元数据,以及将原数据转换为类型库的工具;
类型安全:非托管编译器不会对指针类型提供任何类型检查,所以会使代码很容易受到潜在的危害的影响。在通常情况下,托管代码需要更高级的新人级别。程序员虽然可以继续在托管代码的不安全中使用的指针,但是因为不安全行为受到一些限制;
版本控制:COM接口是不可变的,如果要更改接口,则必须使用新的GUID对其进行重命名。托管类型可以使用同一名称进行深化。
名称相同的两个类型,在托管代码和非托管代码之间是不同的,在不同的语言之间也是不同的,所以在进行代码互操作时,必须进行封装处理。大多数的数据类型在托管和非托管内存中都具有公共表示形式。通过使用.Net框架的互操作机制的封送拆收器,可以处理这些这些同名但不同意义的类型。如果类型不明确,或在托管内存中不存在这些类型,则必须个人编码,并向封送拆收器提供如何封送不明确类型的显示指令,以显式地进行封送处理。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • gorllen
  • (gorllen)
  • 等 级:
#31楼 得分:0回复于:2010-10-12 22:25:04 表示正在学习。。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ymenghong
  • (ymenghong)
  • 等 级:
#32楼 得分:0回复于:2010-10-18 09:32:26 还是不太明白。如果在C#中用socket发送一个unsigned char 类型的数据,是不是就涉及到上面的概念???
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

请大家讨论下,托管代码和非托管代码的区别,谢谢!

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:32

 

托管代码、非托管代码在MSDN讲的很细

请大家讨论下,托管代码和非托管代码的区别,谢谢! 

  • Dobzhansky
  • (Gecko - 么个?则个!)
  • 等 级:
#4楼 得分:10回复于:2009-02-28 22:45:11 .net 规范里头描述了一个
VES (Virtual Execution System)

微软的实现叫 Microsoft Common Language Runtime(CLR)
是运行在 windows 平台上的.
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:如何以派生类名作为参数,在另一个类中实例化父类成员

  • jscn123789abc
  • (aaa)
  • 等 级:
#5楼 得分:0回复于:2009-02-28 23:31:28 谢谢楼上朋友的回复,细节问题还是挺多的...

最近调试一些程序总是因为委托使用不当,
导致系统崩溃,提示托管代码方面的错误提示...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:对一个字符串里的字母倒序,别的字符保持原位不变? 这还需要讨论吗?由CLR执行的代码就是托管代码...反之就是非托管代码,非托管代码由操作系统直接执行...

  • agentianle
  • (天乐)
  • 等 级:
#6楼 得分:10回复于:2009-03-01 00:25:35 托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • hangang7403
  • (学习者)
  • 等 级:
#7楼 得分:2回复于:2009-03-01 08:24:58 up
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • LJH20002004200820131
  • (刘旒)
  • 等 级:
#8楼 得分:2回复于:2009-03-01 08:30:57 up一个
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
另外托管代码和非托管代码目前都是.NET才有的术语...也可以把所有本机代码都叫非托管代码...

  • amandag
  • (高歌)
  • 等 级:
  • 2

    更多勋章
#9楼 得分:2回复于:2009-03-01 08:32:16 这种基础概念还是看看书更好
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • yuanmanguo
  • (godogoflive)
  • 等 级:
#10楼 得分:10回复于:2009-03-01 08:43:02 在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
托管代码 交给 一个虚拟机(比如微软的CLR, mono 的叫啥?), 虚拟机翻译成 cpu 认识的代码执行
非托管代码直接交给 CPU 执行.

  • yuanmanguo
  • (godogoflive)
  • 等 级:
#11楼 得分:10回复于:2009-03-01 08:43:24 公共语言运行库概述 
编译器和工具公开运行库的功能并使您能够编写受益于此托管执行环境的代码。使用针对运行库的语言编译器开发的代码称为托管代码;使用托管代码有很多好处,因为它具有诸多功能,如跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。 

若要使运行库能够向托管代码提供服务,语言编译器必须发出对代码中的类型、成员和引用进行描述的元数据。元数据与代码一起存储;每个可加载的公共语言运行库可移植可执行 (PE) 文件都包含元数据。运行库使用元数据完成以下任务:查找和加载类,在内存中对实例进行布局,解析方法调用,生成本机代码,强制安全性,以及设置运行时上下文边界。 

运行库自动处理对象布局和管理对对象的引用,当不再使用对象时释放它们。其生存期以这种方式来管理的对象称为托管数据。垃圾回收消除了内存泄漏以及其他一些常见的编程错误。如果代码是托管的,则可以在 .NET Framework 应用程序中使用托管数据、非托管数据或者使用这两者。由于语言编译器提供它们自己的类型(如基元类型),因此可能并不总是知道(或需要知道)数据是否是托管的。 

公共语言运行库使设计其对象能够跨语言交互的组件和应用程序变得很容易。用不同语言编写的对象可以互相通信,并且它们的行为可以紧密集成。例如,可以定义一个类,然后使用不同的语言从原始类派生类或调用原始类的方法。还可以将类的实例传递到用不同的语言编写的类的方法。这种跨语言集成之所以成为可能,是因为针对运行库的语言编译器和工具使用由运行库定义的通用类型系统,而且它们遵循运行库关于定义新类型以及创建、使用、保持和绑定到类型的规则。 

所有托管组件都携带有关生成所基于的组件和资源的信息,作为其元数据的一部分。运行库使用这些信息确保组件或应用程序具有它需要的所有内容的指定版本,这使代码不太可能由于某些未满足的依赖项而中断。注册信息和状态数据不再保存在注册表(在注册表中建立和维护它们会很困难)中。相反,有关您定义的类型(和它们的依赖项)的信息作为元数据与代码存储在一起,这样大大降低了组件复制和移除任务的复杂性。 

语言编译器和工具按照对于开发人员来说有用而直观的方式来公开运行库的功能。这意味着运行库的某些功能可能在一个环境中比在另一个环境中更引人注意。您对运行库的体验取决于您使用的语言编译器或工具。例如,如果您是一位 Visual Basic 开发人员,您可能会注意到有了公共语言运行库,Visual Basic 语言的面向对象的功能比以前多了。下面是运行库的一些优点: 

性能改进。 
能够轻松使用用其他语言开发的组件。 
类库提供的可扩展类型。 
新的语言功能,如面向对象的编程的继承、接口和重载;允许创建多线程的可缩放应用程序的显式自由线程处理支持;结构化异常处理和自定义属性支持。 
如果使用 Microsoft® Visual C++® .NET,则可以使用 C++ 托管扩展来编写托管代码。C++ 托管扩展提供了托管执行环境以及对您所熟悉的强大功能和富于表现力的数据类型的访问等优点。其他运行库功能包括: 

跨语言集成,特别是跨语言继承。 
垃圾回收,它管理对象生存期,使引用计数变得不再必要。 
自我描述的对象,它使得使用接口定义语言 (IDL) 不再是必要的。 
编译一次即可在任何支持运行库的 CPU 和操作系统上运行的能力。 
还可以使用 C# 语言编写托管代码。C# 语言提供了下列优点: 

完全面向对象的设计。 
非常强的类型安全。 
很好地融合了 Visual Basic 的简明性和 C++ 的强大功能。 
垃圾回收。 
类似于 C 和 C++ 的语法和关键字。 
使用委托而不是函数指针,从而增强了类型安全和安全性。函数指针通过 unsafe C# 关键字和 C# 编译器 (Csc.exe) 的 /unsafe 选项可用于非托管代码和数据。 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • wuyq11
  • (人生如梦)
  • 等 级:
  • 2

    16

    3

    更多勋章
#12楼 得分:10回复于:2009-03-01 08:53:36 托管代码是指用.net framework支持的语言写的代码。.net framework为了让这些代码可以执行,提供了数个核心运行服务,因此这些代码必须向CLR提供最基本的信息,这些信息就叫做“元数据”。
执行效率
http://www.cnblogs.com/wuchang/archive/2006/12/07/584997.html
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
.net 规范里头描述了一个
VES (Virtual Execution System)

微软的实现叫 Microsoft Common Language Runtime(CLR)
是运行在 windows 平台上的.
托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收

  • JaggerLee
  • (在山的那边海的那边有一群程序员)
  • 等 级:
#13楼 得分:10回复于:2009-03-01 09:02:38 托管代码相当于 java 的字节码,也就是 javac 之后的文件

非托管代码相当于 本机CPU指令序列


.NET 的 CLR 相当于Java解释器


  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • gjl_gjl
  • (Java?.net?)
  • 等 级:
#14楼 得分:2回复于:2009-03-01 09:21:26 学习啊~
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。 

  • wangping_li
  • (总有一天,我星球上的人会来接我)
  • 等 级:
#15楼 得分:10回复于:2009-03-01 11:00:27 这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍


托管代码 (managed code) 
  由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。 
  托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。 
  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。 

非托管代码 (unmanaged code) 
  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
公共语言运行库概述 
编译器和工具公开运行库的功能并使您能够编写受益于此托管执行环境的代码。使用针对运行库的语言编译器开发的代码称为托管代码;使用托管代码有很多好处,因为它具有诸多功能,如跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。 

若要使运行库能够向托管代码提供服务,语言编译器必须发出对代码中的类型、成员和引用进行描述的元数据。元数据与代码一起存储;每个可加载的公共语言运行库可移植可执行 (PE) 文件都包含元数据。运行库使用元数据完成以下任务:查找和加载类,在内存中对实例进行布局,解析方法调用,生成本机代码,强制安全性,以及设置运行时上下文边界。 

运行库自动处理对象布局和管理对对象的引用,当不再使用对象时释放它们。其生存期以这种方式来管理的对象称为托管数据。垃圾回收消除了内存泄漏以及其他一些常见的编程错误。如果代码是托管的,则可以在 .NET Framework 应用程序中使用托管数据、非托管数据或者使用这两者。由于语言编译器提供它们自己的类型(如基元类型),因此可能并不总是知道(或需要知道)数据是否是托管的。 

公共语言运行库使设计其对象能够跨语言交互的组件和应用程序变得很容易。用不同语言编写的对象可以互相通信,并且它们的行为可以紧密集成。例如,可以定义一个类,然后使用不同的语言从原始类派生类或调用原始类的方法。还可以将类的实例传递到用不同的语言编写的类的方法。这种跨语言集成之所以成为可能,是因为针对运行库的语言编译器和工具使用由运行库定义的通用类型系统,而且它们遵循运行库关于定义新类型以及创建、使用、保持和绑定到类型的规则。 

所有托管组件都携带有关生成所基于的组件和资源的信息,作为其元数据的一部分。运行库使用这些信息确保组件或应用程序具有它需要的所有内容的指定版本,这使代码不太可能由于某些未满足的依赖项而中断。注册信息和状态数据不再保存在注册表(在注册表中建立和维护它们会很困难)中。相反,有关您定义的类型(和它们的依赖项)的信息作为元数据与代码存储在一起,这样大大降低了组件复制和移除任务的复杂性。 

语言编译器和工具按照对于开发人员来说有用而直观的方式来公开运行库的功能。这意味着运行库的某些功能可能在一个环境中比在另一个环境中更引人注意。您对运行库的体验取决于您使用的语言编译器或工具。例如,如果您是一位 Visual Basic 开发人员,您可能会注意到有了公共语言运行库,Visual Basic 语言的面向对象的功能比以前多了。下面是运行库的一些优点: 

性能改进。 
能够轻松使用用其他语言开发的组件。 
类库提供的可扩展类型。 
新的语言功能,如面向对象的编程的继承、接口和重载;允许创建多线程的可缩放应用程序的显式自由线程处理支持;结构化异常处理和自定义属性支持。 
如果使用 Microsoft® Visual C++® .NET,则可以使用 C++ 托管扩展来编写托管代码。C++ 托管扩展提供了托管执行环境以及对您所熟悉的强大功能和富于表现力的数据类型的访问等优点。其他运行库功能包括: 

跨语言集成,特别是跨语言继承。 
垃圾回收,它管理对象生存期,使引用计数变得不再必要。 
自我描述的对象,它使得使用接口定义语言 (IDL) 不再是必要的。 
编译一次即可在任何支持运行库的 CPU 和操作系统上运行的能力。 
还可以使用 C# 语言编写托管代码。C# 语言提供了下列优点: 

完全面向对象的设计。 
非常强的类型安全。 
很好地融合了 Visual Basic 的简明性和 C++ 的强大功能。 
垃圾回收。 
类似于 C 和 C++ 的语法和关键字。 
使用委托而不是函数指针,从而增强了类型安全和安全性。函数指针通过 unsafe C# 关键字和 C# 编译器 (Csc.exe) 的 /unsafe 选项可用于非托管代码和数据。 

  • heart_string
  • 等 级:
#16楼 得分:2回复于:2009-03-01 11:06:25 可以举个例子不?
什么样的代码是托管代码?
什么样的代码是非托管代码?
这个问题我也不清楚,还望大虾们指教!
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • yagebu1983
  • (丐帮帮主)
  • 等 级:
#17楼 得分:0回复于:2009-03-01 11:10:51 讲的都很详细啊。。。
up。。。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
托管代码是指用.net framework支持的语言写的代码。.net framework为了让这些代码可以执行,提供了数个核心运行服务,因此这些代码必须向CLR提供最基本的信息,这些信息就叫做“元数据”。
执行效率
http://www.cnblogs.com/wuchang/archive/2006/12/07/584997.html

  • jscn123789abc
  • (aaa)
  • 等 级:
#18楼 得分:0回复于:2009-03-01 23:40:53 谢谢楼上朋友的回复,分析的很深入...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • jscn123789abc
  • (aaa)
  • 等 级:
#19楼 得分:0回复于:2009-03-15 18:51:36 谢谢楼上朋友的回复....
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • Wind_08
  • (brook)
  • 等 级:
#20楼 得分:0回复于:2009-03-15 19:05:52
引用 15 楼 wangping_li 的回复:
这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍


托管代码 (managed code)
  由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
  托管代码是可以使用20多种支持Microsoft…


学习
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
托管代码相当于 java 的字节码,也就是 javac 之后的文件

非托管代码相当于 本机CPU指令序列


.NET 的 CLR 相当于Java解释器
这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍


托管代码 (managed code) 
  由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。 
  托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。 
  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。 

非托管代码 (unmanaged code) 
  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。

  • typeof
  • (null)
  • 等 级:
#21楼 得分:0回复于:2009-03-15 19:50:49 学习。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • fanbo
  • (天天编程)
  • 等 级:
#22楼 得分:0回复于:2009-03-15 19:54:18 不明白,学习,要分
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • Jueyoung
  • (早上可以吃鸡蛋, 喝粥了!)
  • 等 级:
#23楼 得分:0回复于:2009-05-26 09:15:11 收藏了
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
在公共运行时之外执行的代码被称为非托管代码,例如:常见的COM组件、ActiveX控件和Win32 API函数等都是非托管代码.
区别如下
代码模型:非托管代码通过接口来进行通信,百托管代码则不必经过接口,而是直接传递数据;
错误处理机制:COM方法通常返回HRESULT,表示调用成功还是失败。托管代码是通过一场机制来进行错误处理;
标识:GUID标识特定的非托管类型,但并不是提供类型的位置信息。托管类型的名称不但包含类型名,而且还包含唯一的程序集名称。因为程序集名唯一的标识类型,所以可以跨越多个程序集来重用某一类型名称;
类型定义:COM组件的类型库只包含公共类型,并且是可选的。在托管编程模式中,类型信息对于所有类型来说都是强制性的。互操作服务提供了用于将类型库转换为程序集中的元数据,以及将原数据转换为类型库的工具;
类型安全:非托管编译器不会对指针类型提供任何类型检查,所以会使代码很容易受到潜在的危害的影响。在通常情况下,托管代码需要更高级的新人级别。程序员虽然可以继续在托管代码的不安全中使用的指针,但是因为不安全行为受到一些限制;
版本控制:COM接口是不可变的,如果要更改接口,则必须使用新的GUID对其进行重命名。托管类型可以使用同一名称进行深化。
名称相同的两个类型,在托管代码和非托管代码之间是不同的,在不同的语言之间也是不同的,所以在进行代码互操作时,必须进行封装处理。大多数的数据类型在托管和非托管内存中都具有公共表示形式。通过使用.Net框架的互操作机制的封送拆收器,可以处理这些这些同名但不同意义的类型。如果类型不明确,或在托管内存中不存在这些类型,则必须个人编码,并向封送拆收器提供如何封送不明确类型的显示指令,以显式地进行封送处理。

  • jscn123789abc
  • (aaa)
  • 等 级:
#24楼 得分:0回复于:2009-05-26 23:35:49 ding...
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • start55
  • (start55)
  • 等 级:
#25楼 得分:0回复于:2010-01-18 23:34:23 学习 ,接分
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • fengqipiaobo
  • (风起漂泊)
  • 等 级:
#26楼 得分:0回复于:2010-06-25 21:57:15 学习了!
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • niit_zc
  • (绝对零度)
  • 等 级:
#27楼 得分:0回复于:2010-07-15 15:17:09 学习!
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • laichunlin
  • (小赖)
  • 等 级:
#28楼 得分:0回复于:2010-07-30 15:42:58 分析的很好,学习
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • xiatiandetonghua
  • (xiatiandetonghua)
  • 等 级:
#29楼 得分:0回复于:2010-08-15 15:44:43 深入学习
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • handong520
  • (寒冬)
  • 等 级:
#30楼 得分:0回复于:2010-10-03 11:57:07 在公共运行时之外执行的代码被称为非托管代码,例如:常见的COM组件、ActiveX控件和Win32 API函数等都是非托管代码.
区别如下
代码模型:非托管代码通过接口来进行通信,百托管代码则不必经过接口,而是直接传递数据;
错误处理机制:COM方法通常返回HRESULT,表示调用成功还是失败。托管代码是通过一场机制来进行错误处理;
标识:GUID标识特定的非托管类型,但并不是提供类型的位置信息。托管类型的名称不但包含类型名,而且还包含唯一的程序集名称。因为程序集名唯一的标识类型,所以可以跨越多个程序集来重用某一类型名称;
类型定义:COM组件的类型库只包含公共类型,并且是可选的。在托管编程模式中,类型信息对于所有类型来说都是强制性的。互操作服务提供了用于将类型库转换为程序集中的元数据,以及将原数据转换为类型库的工具;
类型安全:非托管编译器不会对指针类型提供任何类型检查,所以会使代码很容易受到潜在的危害的影响。在通常情况下,托管代码需要更高级的新人级别。程序员虽然可以继续在托管代码的不安全中使用的指针,但是因为不安全行为受到一些限制;
版本控制:COM接口是不可变的,如果要更改接口,则必须使用新的GUID对其进行重命名。托管类型可以使用同一名称进行深化。
名称相同的两个类型,在托管代码和非托管代码之间是不同的,在不同的语言之间也是不同的,所以在进行代码互操作时,必须进行封装处理。大多数的数据类型在托管和非托管内存中都具有公共表示形式。通过使用.Net框架的互操作机制的封送拆收器,可以处理这些这些同名但不同意义的类型。如果类型不明确,或在托管内存中不存在这些类型,则必须个人编码,并向封送拆收器提供如何封送不明确类型的显示指令,以显式地进行封送处理。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • gorllen
  • (gorllen)
  • 等 级:
#31楼 得分:0回复于:2010-10-12 22:25:04 表示正在学习。。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

  • ymenghong
  • (ymenghong)
  • 等 级:
#32楼 得分:0回复于:2010-10-18 09:32:26 还是不太明白。如果在C#中用socket发送一个unsigned char 类型的数据,是不是就涉及到上面的概念???