c#中托管代码和非托管代码的区别!

c#中托管代码和非托管代码的区别!,第1张

这个要和net的资源自动回收管理联系起来说,托管代码是可以被系统自动回收的,所以它是安全的;非托管代码系统不能自动回收,需要你自己销毁,过多的使用而不去销毁会使程序溢出,所以它是相对不安全的

1简单的说,就是代码被编译成MSIL后在net的Framework下运行,同操作系统底层的交互都交给framework去做。所谓非托管代码就是脱离了Framework的管制,直接同底层API打交道,自己管理自己的内存和安全机制等东西。而托管代码就不管这些,全都由Framework去完成

2“程序”一般都是在对操作系统进行直接或者间接的操作

“托管程序”是需要通过访问公共语言运行时(cls)才能访问操作系统的程序

而“非托管程序”不用通过访问公共语言运行时(cls)可以直接访问操作系统的程序

3vbnet,C#等写的程序是托管程序,VC++可以写托管程序,如果用到了内存管理,则只能编译为非托管程序这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、net框架设计、Effective C#之类的书籍

托管DLL,说白了,就是 完全由NET托管代码实现的DLL,完全依赖于 NET 平台的 CLR 运行。托管DLL,受NET CLR管控,支持内存自动回收等的,对于NET平台是安全DLL

非托管DLL,是指完全或者部分 不是用NET代码实现,不依赖于NET平台即可运行,例如 COM方式 的DLL,不支持自动回收内存,对于NET平台而言,也是非安全可控的。

珠海校外托管行业代码是51440300MJL1965492。校外托管已逐渐成为新型产业。现在双职工的家庭比较多,托育机构开办在社区内给家长接送带来了极大的便利,除此之外也为周末或假期的亲子活动提供了场所,更能满足家长的需求。

一、绪论

当微软推出VSnet7实现了可扩展的托管C++后,C++程序员们反映不一。尽管大部分的程序员对于能够继续使用C++感到很欣慰,但几乎所有的人对于托管C++提供的晦涩语法感到很痛苦。微软明显从反馈中感觉到托管C++不是那么成功。

 2003年10月6日,ECMA(欧洲计算机制造商协会)宣布成立专家组,负责结合ISO标准C++与通用语言,开发一个可扩展语言的标准,这个新的可扩展语言被称为C++/CLI标准。这个标准将被VSnet2005的C++编译器支持。

 二、老语法存在的问题

 1、晦涩繁琐的语法和文法--这两个"双重底线"问题加重了阅读的负担。

 2、二流的CLI支持--相对与C#与VBNET,MC++使用不方便的工作区来提供CLI支持,例如,它没有一个一一对应的结构来列举NET的集合。

 3、C++与NET粗陋地结合--对于CLI类型,你不能使用C++的特色,例如模板;同样,对于C++类型,你不能使用CLI的特色,例如碎片帐集。

 4、令人混淆的指针--非托管的C++的指针及托管的引用指针都使用语法,这非常令人混淆,因为-gc指针与托管指针在本质和行为上完全不同。

 5、MFC编译器不能产生可校验的代码。

 三、C++/CLI给我们提供了什么?

 1、优雅流畅的语法和文法--C++/CLI为C++开发人员书写托管代码提供了一种非常自然的感觉,并且它提供了非托管代码到托管代码的平滑过度。以前所谓的"双重底线"问题现在已经荡然无存。

 2、一流的CLI支持--CLI特色,例如属性、碎片集合和属类得到了直接支持,此外,C++/CLI还准许将这些特色用于本地非托管的类。

 3、一流的C++类支持--C++特色,例如模板和析构函数对于拖管和非拖管类继续有效。实际上,C++/CLI是你可以"表面上"在栈或C++本地堆上声明一个NET类型的NET语言。

 4、在NET与C++之间的沟壑上架起了一座桥梁--C++开发人员在抨击BCL时不再象离开水的鱼。

 5、C++/CLI编译器产生的可执行文件完全是可校验的。

 四、"Hello World"小程序

using namespace System;

void _tmain()

{

Console::WriteLine("Hello World");

}

  上述代码除了不需要引用mscorlibdll库外,与老的语法没有太大的区别,因为无论你什么时候使用/clr进行我,编译器都可以暗中进行引用(现在默认的是/clr:newSyntax)。

 五、句柄

 与老的语法主要的混淆是我们习惯于使用符号来声明拖管引用或非拖管指针,在C++/CLI里微软引入了句柄的概念。

void _tmain()

{

//The ^ punctuator represents a handle

String^ str = "Hello World";

Console::WriteLine(str);

}

  ^符号代表一个托管对象(声明时看上去象个帽子),按照CLI的规定,句柄代表一个拖管对象的引用。句柄在CLI中是新的语法,相当于C++中的-gc指针。句柄与指针不再混淆,在本质上两者完全不同。

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

托管代码是可以使用20多种支持Microsoft NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic NET, Microsoft JScript NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware compiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。

优点

在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。

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

1源代码编译为托管代码;(所以源代码可以有很多种,如VB,C#,J#)

2托管代码编译为microsoft系统的net平台专用文件(如类库、可执行文件等)。

欢迎分享,转载请注明来源:表白网

原文地址:https://h5.hunlipic.com/biaobai/3137366.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-02-08
下一篇2024-02-08

发表评论

登录后才能评论

评论列表(0条)

    保存