[请大家讨论]托管代码和非托管代码的区别。。。

jscn123789abc 2009-02-28 10:35:34
请大家讨论下,托管代码和非托管代码的区别,谢谢!
...全文
2388 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
景能 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 handong520 的回复:]

在公共运行时之外执行的代码被称为非托管代码,例如:常见的COM组件、ActiveX控件和Win32 API函数等都是非托管代码.
区别如下
代码模型:非托管代码通过接口来进行通信,百托管代码则不必经过接口,而是直接传递数据;
错误处理机制:COM方法通常返回HRESULT,表示调用成功还是失败。托管代码是通过一场机制来进行错误处理;
标识:GUID标识特定的非托管类型,但并不是提供类型的……
[/Quote]
回答的人倒是挺多的,可惜全TM的copy网上的了事。。。不知道他自己是否懂了,要是懂了,怎么不能用自己的话说出来。。。还就这哥们的算是说到点子上,虽然很不通顺,但至少是人话,不是鸟语,能看懂。。。
ymenghong 2010-10-18
  • 打赏
  • 举报
回复
还是不太明白。如果在C#中用socket发送一个unsigned char 类型的数据,是不是就涉及到上面的概念???
gorllen 2010-10-12
  • 打赏
  • 举报
回复
表示正在学习。。
handong520 2010-10-03
  • 打赏
  • 举报
回复
在公共运行时之外执行的代码被称为非托管代码,例如:常见的COM组件、ActiveX控件和Win32 API函数等都是非托管代码.
区别如下
代码模型:非托管代码通过接口来进行通信,百托管代码则不必经过接口,而是直接传递数据;
错误处理机制:COM方法通常返回HRESULT,表示调用成功还是失败。托管代码是通过一场机制来进行错误处理;
标识:GUID标识特定的非托管类型,但并不是提供类型的位置信息。托管类型的名称不但包含类型名,而且还包含唯一的程序集名称。因为程序集名唯一的标识类型,所以可以跨越多个程序集来重用某一类型名称;
类型定义:COM组件的类型库只包含公共类型,并且是可选的。在托管编程模式中,类型信息对于所有类型来说都是强制性的。互操作服务提供了用于将类型库转换为程序集中的元数据,以及将原数据转换为类型库的工具;
类型安全:非托管编译器不会对指针类型提供任何类型检查,所以会使代码很容易受到潜在的危害的影响。在通常情况下,托管代码需要更高级的新人级别。程序员虽然可以继续在托管代码的不安全中使用的指针,但是因为不安全行为受到一些限制;
版本控制:COM接口是不可变的,如果要更改接口,则必须使用新的GUID对其进行重命名。托管类型可以使用同一名称进行深化。
名称相同的两个类型,在托管代码和非托管代码之间是不同的,在不同的语言之间也是不同的,所以在进行代码互操作时,必须进行封装处理。大多数的数据类型在托管和非托管内存中都具有公共表示形式。通过使用.Net框架的互操作机制的封送拆收器,可以处理这些这些同名但不同意义的类型。如果类型不明确,或在托管内存中不存在这些类型,则必须个人编码,并向封送拆收器提供如何封送不明确类型的显示指令,以显式地进行封送处理。
xiatiandetonghua 2010-08-15
  • 打赏
  • 举报
回复
深入学习
laichunlin 2010-07-30
  • 打赏
  • 举报
回复
分析的很好,学习
niit_zc 2010-07-15
  • 打赏
  • 举报
回复
学习!
fengqipiaobo 2010-06-25
  • 打赏
  • 举报
回复
学习了!
start55 2010-01-18
  • 打赏
  • 举报
回复
学习 ,接分
jscn123789abc 2009-05-26
  • 打赏
  • 举报
回复
ding...
Jueyoung 2009-05-26
  • 打赏
  • 举报
回复
收藏了
fanbo 2009-03-15
  • 打赏
  • 举报
回复
不明白,学习,要分
typeof 2009-03-15
  • 打赏
  • 举报
回复
学习。
测试菜鸟 2009-03-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wangping_li 的回复:]
这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍


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

学习
jscn123789abc 2009-03-15
  • 打赏
  • 举报
回复
谢谢楼上朋友的回复....
天乐 2009-03-01
  • 打赏
  • 举报
回复
托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
jscn123789abc 2009-03-01
  • 打赏
  • 举报
回复
谢谢楼上朋友的回复,分析的很深入...
yagebu1983 2009-03-01
  • 打赏
  • 举报
回复
讲的都很详细啊。。。
up。。。
heart_string 2009-03-01
  • 打赏
  • 举报
回复
可以举个例子不?
什么样的代码是托管代码?
什么样的代码是非托管代码?
这个问题我也不清楚,还望大虾们指教!
wangping_li 2009-03-01
  • 打赏
  • 举报
回复
这些东西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)
  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
加载更多回复(13)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧