基于.NET Compact Framework开发的程序可以叫做托管程序英文叫做Managed code。所谓Managed code就是使用C#,VB.NET语言来编写代码使用.NET Compact Framework来开发编译成平台无关的中间语言(Intermediate Lanuage, IL)的文件的程序。基于.NET Compact Framework开发的程序在编写的时候会使用到.NET Compact Framework 基础类库(.NET Compact Framework Base Class Libraries, BCL) BCL为应用程序提供API。托管程序在运行的时候会使用到运行时执行引擎(run-time Execution Engine, EE), BCL和EE统称为Common Language Runtime (CLR)。当托管程序首次执行的时候CLR会把IL文件编译成相关平台的binary文件(可执行文件)。这个过程叫做Just-In-Time (JIT) compilation。由于有了这一个过程所以所有托管代码都依赖于CLR因此需要运行托管代码的设备必须安装 .NET Compact Framework。图来自于Windows Embedded CE 6.0 Fundamentals Chapter 9.通俗化Native Code vs. Managed Code上面讲述了一堆理论的东西下面使用一个通俗但不是很贴切的例子讲述Native和ManagedNative翻译成原生其实有地道的与生俱来的意思例如你天生说普通话那么可以说你是Mandarin Native Speaker。也就是与生俱来说普通话地地道道的普通话。如果你要做一些语言相关的产品进行销售如果你在销售产品之前把之翻译成各个语言例如在国内销售翻译成中文在美国翻译成英文在日本翻译成日文这好比你使用Native Code来开发在编译时已经为各个硬件平台生成原生的机器代码。但是Managed(托管)代码就好比世界语世界上没有那个民族和地区天生就说世界语但是你使用世界语来销售你的产品。针对每个不同国家和地区你附送一个及时翻译机这个翻译机会在用户使用的时候把世界语翻译成当地原生语言。这就好比基于.NET Compact Framework开发的代码需要CLR来翻译执行。这里注意不同硬件平台CLR是不一样的他们功能都是把IL编译成Native的机器码但是各个平台的机器码不一样所以.NET Compact Framework也不一样。.NET Compact Framework帮你处理了平台差异性因此.NET Compact Framework的程序是跨平台的就像世界语加上翻译机那样基于.NET Compact Framework编写的代码可以支持任何平台前提是微软为具体平台实现CLR。例如大家都知道Yahoo其实世界上有一种快要消失的语言就叫做Yahoo如果你做一个世界语到Yahoo语的翻译机那么你的产品可以不做任何修改就卖到讲Yahoo语的地方了。理论讲Native Code vs. Managed CodeNative CodeManaged Code编译成平台相关的机器码编译成IL(Intermediate Language)为各个不同设备编译不同版本的执行文件一次编译各种设备到处运行不需要其他框架支持相对于.NET Compact Framework来说需要CLR支持也就是需要安装.NET Compact Framework Rumtime可以最大限度的访问系统提供的API和服务只能访问.NET Compact Framework 提供的服务例如WIFI和Bluetooth.NET Compact Framework 的BCL不提供支持所以如果只是使用.NET Compact Framework 是不能进行WIFI和Bluetooth的开发的。由于有上述的限制性所以微软提供P/Invoke来访问平台相关的API和COM。可以使用MFCATLWTLSTL等库进行开发可以使用.NET Compact Framework 的BCL进行开发如何选择Native Code和Managed Code了解了Native Code 和 Managed Code的异同可以根据其特点和相应的需求进行选择。没有绝对的好坏所以才存在两个平台同时存在的现状。Native Code开发速度相对慢一些因为没有.NET Compact Framework 的Base Class Libraries的支持。BCL为开发者做了大量的封装例如Garbage CollectionWindows formWeb Service等等。基于BCL开发者可以专注于业务的开发。所以使用.NET Compact Framework一般来说可以节省不少开发时间。时至今日库对语言的影响越来越多如果没有RoRRuby可能还是一个籍籍无名的日本方言。C之父BjarneStroustrup说C的扩展更多的在STL的扩展通过STL来支持新特性以此C从语法上一直没有大变化但是由于STL的不断扩展而不断带来新的活力。可见库对一个语言和开发人员的重要性。在这方面.NET Compact Framework 胜出但是Native C还是可以通过MFCATLWTLSTL来补救。我本人十分喜欢使用WTL处理界面和大量使用STL关于WTL可以参考Windows Mobile和Wince(Windows Embedded CE)下的WTL(Windows Template Library)开发Windows Mobile 和 Wince(Windows Embedded CE) 下的 WTL(Windows Template Library) 界面(UI)开发Windows Mobile和Wince下使用WTL进行Windows Media Player开发关于在今日插件使用WTL的问题Windows Mobile下使用Native C(WTL, MFC, Win32)开发如何为对话框加入菜单Windows Mobile下如何去掉WTL对话框CStdDialogImpl的OK按钮在Windows Mobile下使用WTL进行Native C开发如何显示等待图标在Windows Mobile和Wince(Windows Embedded CE)下进行WTL开发如何加入超链接(HyperLink)但是Native Code执行速度相对快因为基于.NET Compact Framework 的代码有JIT的过程第一次执行需要把IL编译到Native机器码而Native Code本身就是机器码所以Native Code快很多。同时Native Code使用的memory footprint也少很多很多Native Code使用的footprint只是和你编写的代码分配内存有关。但是基于.NET Compact Framework 的代码尽管一个几乎没有任何功能的程序启动的时候也需要1到2M的内存。这些内存用于处理Garbage Collection等用途。Native Code和Managed Code存在一个可控性的gap.NET Compact Framework 是.NET Framework的精装版封装了一部分.NET Framework的功能但是不完全包含.NET Framework的所有功能。Native Code具有完全访问系统API和服务平台API的能力而.NET Framework不完全具备.NET Compact Framework 就更加不具备所以从系统可操控性来说Native Code和Managed Code存在一个gap这个gap是指有些功能Native Code可以做但是Managed Code却无法实现的功能例如WIFIBluetooth。要在.NET Compact Framework 实现这些功能必须通过P/Invoke来实现关于P/Invoke可以参考一下.NET Compact Framework 下Win32 API P/Invoke 的使用开发P/Invoke的工具与Website如何在Windows Mobile下使用Native C动态加载DLLWindows Mobile和Wince(Windows Embedded CE)下如何封装Native DLL提供给.NET Compact Framework进行调用Windows Mobile和Wince(Windows Embedded CE)下封装Native DLL进一步探讨在Windows Mobile和Wince(Windows Embedded CE)下封装Native DLL的回调函数由于这个可控性的gap的存在所以出现了OpenNETCF的Smart Device Framework32feet.net等库这些库为基于.NET Compact Framework的程序封装了P/Invoke的调用这样减少了gap的存在。32feet.net可以参考 基于32feet.net对Broadcom(Widcomm) stack蓝牙(Bluetooth)设备开发Windows Mobile与PC程序 等系列文章。当然微软也不断的在填补这个gap.NET Compact Framework的不断升级这个gap越来越小了例如.NET Compact Framework 1.0没有串口操作但是在.NET Compact Framework 2.0已经加上。可是.NET Compact Framework的rumtime就越来越大同时启动也越来越慢任何都是均衡移动设备受到CPU速度和内存的限制.NET Compact Framework 并不是加入越多功能越好。过犹不及中国人常说的。Balabala...说那么多还是没有说到底如何选择其实是trade-off(均衡)没有绝对真理还是根据具体需求结合上述Native Code和Managed Code的特点来选择。我自己的经验如果速度要求快内存要求少的核心模块都是使用Native C一般包括无界面纯数据处理的程序和完全自定义界面的GDI程序其他模块都用.NET Compact Framework。如果一个模块需要大量使用P/Invoke也是需要考虑使用Native C来代替.NET Compact Framework的。目前觉得选择还是OK的。