您的位置:首页 > 其它

适用于 Windows CE .NET 的 Microsoft .NET Framework 精简版(转)

2009-08-10 01:39 316 查看
适用于:
Microsoft®Windows®CE.NET
MicrosoftPlatformBuilder4.0
Microsoft.NETFramework精简版
Microsoft.NET

摘要:MicrosoftWindowsEmbeddedMVPPaulYao概要介绍了Microsoft.NET如何适用于WindowsEmbeddedDeveloperCommunity的嵌入式系统开发人员。(本文包含一些指向英文站点的链接。)

注意:本白皮书描述适用于嵌入式系统开发人员的Microsoft.NET基本元素。本文描述的.NETFramework精简版附带有MicrosoftVisualStudio.NET的一个开发附件,称为SmartDeviceExtensions(SDE)。在撰写本文时,SDE技术预览已经推出,而且预计还将在2002年6月推出Beta版。本白皮书讲述的主题包括:
.NET与MicrosoftWin32相比的优势
.NET基础
嵌入式设备中的.NETFramework精简版
本文内容仅供参考,只是为了您的方便而提供。与使用本文以及因此导致的后果相关的全部风险均由用户自己承担。
Windows硬件工程会议
作者免责声明和版权:

©2002ThePaulYaoCompany版权所有。保留所有权利。

WinHEC主办者免责声明本文内容不是由Microsoft或WinHEC会议联合主办者(以下简称“WinHEC主办者”)创作的,也没有经过WinHEC主办者确认。因此,本文包含的信息并不代表WinHEC主办者的观点,并且WinHEC主办者不保证其准确性。WinHEC主办者对本信息不提供任何明示或隐含的保证。
Microsoft、Windows、WindowsNT、ActiveX、VisualBasic、VisualStudio和Win32是MicrosoftCorporation在美国和/或其他国家或地区的商标或注册商标。本文提及的其他产品和公司名称可能是其各自所有者的商标。

.NET与Win32相比的优势

Microsoft®.NET(读作“Dot-Net”)Framework精简版是一种用于MicrosoftWindows®forPocketPC和MicrosoftWindowsCE.NET的新型应用程序编程接口(API)。这一新型API为移动设备和嵌入式设备带来的好处与完整的.NETFramework给基于Windows的桌面平台带来的好处相同。.NETFramework精简版给程序员提供了两种编程语言选择:MicrosoftVisualBasic®的一个兼容.NET的增强版本,称为VisualBasic.NET;以及MicrosoftVisualC#™(读作“see-sharp”),这是专门为Microsoft.NET开发的C和C++语言家族中的一个新成员。

WindowsCE程序员可能会问:WindowsCE是否需要另一个API?我们目前使用的API有什么问题?.NET给WindowsCE增加了什么?什么时候采用它更有意义?本白皮书将探讨这些问题。

Win32有什么问题?

MicrosoftWin32®是桌面Windows(即MicrosoftWindowsXP)以及嵌入式和移动版本的Windows(这里指WindowsCE)的核心API。但它并不是唯一的API,原因是:它相对底层、古怪、容易出现内存泄漏,总的来说不太好用。

现在也有其他编程接口,包括适用于C++程序员的Microsoft基础类(MFC)库以及MicrosoftVisualBasic和MicrosofteMbeddedVisualBasic。这些API主要是为了解决Win32中的缺陷而创建的,但它们也有自己的缺陷和局限性。例如,MFC实际上是Win32上覆盖的一个薄层。因此,尽管MFC修补和隐藏了Win32的许多瑕疵,但它仍然具有Win32的一些缺陷,尤其是其命名规则非常古怪,而且很容易发生内存泄漏现象。基于Windows的桌面平台上的VisualBasic及其WindowsCE精简版eMbeddedVisualBasic都仅限于用作标准的API。事实上,随着.NETFramework精简版的推出,Microsoft已宣布在未来WindowsCE版本中,将不对eMbeddedVisualBasic进行增强,也不会将它移植到新的CPU体系结构。

不管是否古怪,Win32都有自己的地位。在内存有限的环境中,这是唯一的选择,因为Win32创建的可执行文件最小。(尽管在一个内存有限的环境中,必须加倍小心地避免内存泄漏!)对于某些类型的软件(主要是操作系统扩展),您别无选择,只能使用Win32。这对于设备驱动程序、命令解释程序扩展、控制面板小程序、OEM适配层(OAL)以及其他底层模块也都适用。在这样的情况下,Win32是唯一的可用编程接口。

.NET有什么优点?

.NET代表着使编程更加高效的一种系统化的努力成果。也就是说,.NET不是简单的一个元素,而是许多元素的综合体。.NET的每个元素都体现了如何简化代码的编写;总体来看,所有元素都代表着一种方向-有人称之为革命。对于Microsoft的长期客户来说,它代表着Microsoft以Internet为中心的重新塑造。而且,为Windows的任何版本(桌面或嵌入式)开发软件的人都需要评估.NET对他们有何影响,而不是是否会影响他们。

但是,为什么需要进行这些改变呢?这是因为软件开发目前仍然是一项人力密集度非常高的、容易出错的活动。相比之下,硅密度(以及用于在硅中设计复杂电路的工具)的进步已经使硬件产生了惊人的发展。而软件开发方面的进步要小得多。但是,考虑到软件的重要性(对于某些企业来说,软件是一个关键的增值领域),提高软件开发效率的努力很可能会产生巨大而持久的效益。

.NET基础

关于.NET的资料已经有很多,因此,本白皮书只讲述一些基础性的知识。为了便于理解.NETFramework精简版具备什么功能,我在此概要介绍一下适用于在PocketPC和支持WindowsCE.NET的设备上构建移动式和嵌入式应用程序的.NET关键元素。

.NET包含了许多元素,限于篇幅,我将重点介绍一些关键元素,而有些元素在此不会提及。有关.NET的更详细信息,请访问Microsoft.NETWeb站点。

.NET应用程序类

.NET包含三个常规应用程序类:

Windows窗体-在客户端系统上运行的传统GUI应用程序。.NETFramework精简版支持桌面.NETFramework的一个子集,可用于创建基于WindowsCE的GUI应用程序。

Web窗体-基于浏览器的应用程序(即基于HTML的应用程序),具有一个客户端组件和一个Web服务器端组件。尽管.NETFramework精简版本身没有内置对Web窗体的支持,但基于浏览器和WindowsCE的应用程序仍然可以受益于基于.NET的Web服务器的强大灵活性。将MicrosoftMobileInternetToolkit(MMIT)安装到这样的服务器上时,MMIT会进一步增强支持各种便携式设备标记语言的能力,这些标记语言包括HTML、CompactHTML(cHTML)和无线应用协议/无线标记语言(WAP/WML)。

Web服务-基于Web服务器的远程过程调用(RPC)机制。该机制使用以XML编码的数据报,而且这些数据报是按照SOAP协议生成、并通过HTTP协议进行传输的。.NETFramework精简版支持创建Web服务客户端,但不支持创建Web服务服务器。要部署基于WindowsCE的Web服务服务器的开发人员可以使用用于WindowsCE的SOAP工具包来执行此任务,SOAP工具包包含在带有MicrosoftPlatformBuilder的WindowsCE.NET中。

基于WindowsCE.NET的应用程序将会从所有这三种应用程序类受益。但是,.NETFramework精简版直接支持的类型只有两种:Windows窗体和Web服务客户端。Web窗体将支持WindowsCE设备,但其所有逻辑都将基于服务器。就Web浏览器而言,正常的HTML(或者WAP或cHTML)是在基于WindowsCE的设备和支持.NET的服务器(运行MicrosoftMobileInternetToolkit[MMIT])之间传输的。

.NET体系结构使您能够将来自不同编程语言的代码连接在一起。我将体系结构中的这些部分称为“公共元素”,因为它们名称中都有“公共”一词。就此而言,公共意味着标准。下面是.NET的一些公共元素:

公共语言运行库(CLR)-用于运行.NET可执行文件的运行时环境,具有加载程序、管理内存和其他操作系统核心功能。

公共类型系统-可从所有兼容.NET的编程语言中使用的标准类型。

公共语言接口-类、方法、接口、枚举和.NET的其他编程元素之间的标准链接。

公共中间语言-也称为“Microsoft中间语言”或MSIL,是一种独立于CPU的标准机器语言级代码,可以将所有.NET可执行文件转成该代码。

.NETFramework

.NETFramework是一种专门为易于使用而设计的面向对象的API。.NETAPI的用户界面经过精心设计,是“可发现的”,其目的同样是:一旦了解了基础知识,就非常容易进行编程。比较一下,您就会发现Win32函数仅仅具有最小限度的包装,它们基本上是分散在一组动态链接库(DLL)中的一组函数。当程序员编写Win32代码来创建和控制一个窗口(基本的用户界面对象)时,就需要使用CreateWindow、MoveWindow和ShowWindow等函数。尽管相关的文档有助于您找到它们和相关的函数,但DLL的结构设计使得很难找到所有函数。所有函数(WindowsCE.NET有2,500个函数,比WindowsXP多两倍)都淹没在一个由文件、库文件和DLL组成的海洋中。要找到某个函数,您必须异常警觉,不放过任何有可能会有用的函数。

.NET利用各种类型的容器来解决此问题。而且,事实上.NET具有各种代码容器和数据容器。让我们先看一下.NET代码容器。

函数被打包成类,而类又被打包成命名空间(这些命名空间又可以打包成其他命名空间)。例如,使用一个名为Form的类中的函数创建和控制窗口。Form类包含在System.Windows.Forms命名空间中。可以将一个命名空间名称与一个类名称结合在一起来创建一个完全限定的名称。在刚刚举过的示例中,可以通过System.Windows.Forms.Form明确地引用Form类。在这个类中,您可以找到用于处理窗口的各种元素。

.NETAPI还广泛使用容器来保留数据。例如,Form类有一个名为Controls的容器对象,其类型为ControlCollection。您可以通过调用ControlCollection.Add来添加控件,通过调用ControlCollection.Remove来删除控件,通过检查ControlCollection.Count属性来确定窗体上的控件数目,以及使用通过ControlCollection.GetEnumerator方法提供的枚举器来查看可用控件的列表。如这些示例所示,就象可以将命名空间名称与类名称连接在一起一样,也可以将类名称和成员函数名称连接在一起。

就象Forms类具有可以在ControlCollection集合对象中访问的枚举器一样,许多数据容器也都带有枚举器。枚举器使您可以获得集合内容的完整列表。在前面的示例中,通过请求Controls集合来提供列表,很容易查看窗口中的控件。

这种组织代码和数据的方法的所有方面都表明它是一个高度一致的API。也就是说,一旦熟悉了命名空间的基本概念,您就会看到在必须使用以前未曾用过的某个对象时,命名空间如何帮助您找到相关的函数。而且,一旦您熟悉如何将数据对象放入容器中之后,就很容易了解如何添加、删除、枚举和处理对象的集合。这样,.NET就提供了高度的一致性和易用性-这是.NET系统设计师的大量设计和思考的结果。所有这些都将帮助程序员提高效率。

公共类型系统

公共类型系统(CTS)提供了大量预期的类型:有符号的整数和无符号的整数(8位、16位、32位和64位)以及浮点数。另外,还有用于日期、时间和小数(精确的定点数)的类型(请参见表1)。这组公共的类型简化了不同语言之间的互操作性。在WindowsCE上,您可以使用两种不同的编程语言(C#和VisualBasic.NET)编写.NET程序。

表1:公共.NET类型

.NETFramework类型C#别名VisualBasic.NET别名大小
System.ByteByteByte1字节
System.CharCharChar2字节
System.Int16ShortShort2字节
System.Int32IntInteger4字节
System.Int64LongLong8字节
System.DecimaldecimalDecimal16字节
System.SingleFloatSingle4字节
System.DoubleDoubleDouble8字节
System.DateTimeDateTimeDate8字节
System.StringStringString不等

公共语言接口

公共语言接口(CLI)定义了函数调用所需的绑定。CLI以及前面讲述的公共类型使您很容易用一种语言编写代码,然后再从另一种语言访问该代码。与以前的WindowsAPI不同的是,您可以自由地混合和匹配不同的语言,并且只需很少的努力就能使它们相互操作,同时还不会丢失信息。相比之下,从VisualBasic中调用Win32库就比较费劲。而且,很难从VisualBasic调用C++函数(这是最初开发MicrosoftActiveX®Automation的一个关键原因)。

公共中间语言

.NET可执行文件是用独立于CPU的、称为Microsoft中间语言(MSIL)的机器级代码编写的。这种代码已经以一种称为“公共中间语言”(CIL)的形式提交到ECMA(欧洲标准团体)。无论您使用什么名称(MSIL或CIL)来指称它们,这些可执行文件都可以在任何运行.NETFramework或.NETFramework精简版的系统上运行。在运行时,加载器将MSIL指令转换为ARM、x86、MIPS或SHx指令,而且是本机代码。这有时被称为实时(JIT)执行策略。

这意味着有可能生成一个可以在任何基于WindowsCE的平台上运行的可执行文件。这样的可执行文件也可以在基于Windows的桌面平台(x86Pentium系统或64位Itanium系统)上运行。因此而实现的可移植性将使您能够编写具有非凡的可移植性的代码。这种可移植性的关键是:确定已在.NETFramework精简版中实现的桌面.NETFramework的子集,以及避免使用在.NETFramework精简版中针对WindowsCE进行的扩展,因为这部分扩展在桌面上不能使用。

除了其可移植性以外,MSIL还有另一个优势:可执行文件较小。MSIL可执行文件一般都小于可作比较的x86、ARM、MIPS或SHx可执行文件。

嵌入式设备中的.NETFramework精简版

MicrosoftPlatformBuilder使您能够为自定义的硬件配置和生成WindowsCE映像。所有映像都是从以下两种基本配置生成的:无头(HLBASE)配置和基于显示器(IABASE)的配置。尽管每种配置都可修改成与另一种相似,但较适合Framework精简版的一种是IABASE。毕竟,.NETFramework精简版主要是用来构建GUI应用程序,而且GUI开发不是无头(HLBASE)系统上的选项。表2总结了PlatformBuilder的NewPlatformWizard(新平台向导)中可用的12种配置类型。基于显示器(IABASE)列中的配置是适合.NETFramework精简版的配置。

表2:WindowsCE.NETPlatformBuilder配置

无头(HLBASE)配置基于显示器(IABASE)的配置
媒体工具移动电话或智能电话
驻留网关数字图像处理设备
微内核工业自动化设备
Internet工具
PDA或移动手持设备
零售点设备
机顶盒
Web键盘
Windows瘦客户端
可以通过从PlatformBuilder目录的以下部分添加“.NETFramework精简版技术预览”,将.NETFramework精简版添加到配置中:“CoreOS/Displaybaseddevices/Applications&ServicesDevelopment”。如果检查CESYSGEN.BAT文件,您就会看到这会将dotnetprof2模块添加到DCOM_MODULES环境变量中。

表3总结了构成.NETFramework精简版的文件。这些文件驻留在以下PlatformBuilder目录中:WINCE400OTHERSDOTNET。其中四个文件是特定于CPU的Win32可执行文件。其余文件称为“托管”文件,它有多层含义。首先,这些文件是使用MSIL机器指令的可移植的可执行文件。使它们成为“托管”的原因是,它们是按照一组规则编写的,其中的主要规则是它们不处理内存指针,而是依赖于.NET公共语言运行库中的内存回收器来管理内存。

表3:.NETFramework精简版支持文件

特定于CPU的文件托管(MSIL)文件
mscoree.dllmicrosoft.visualbasic.dll
WFInter.dllmscorlib.dll
DbgIpcPlatMan.dllsystem.data.dll
system.dll
system.drawing.dll
system.net.irda.dll
system.web.services.dll
system.windows.forms.dll
system.xml.dll
Microsoft以技术预览的形式发布了兼容WindowsCE.NET(和PocketPC)的.NETFramework精简版。对于希望尝试一下.NETFramework精简版的开发人员来说,该技术预览提供了一个机会,可以运行一些代码,并可以将基于WindowsCE的.NET版本与桌面版本进行比较。

如前所述,有些文件包含在PlatformBuilder版本4.0和更高版本中。但是,PlatformBuilder目录中缺少两个文件(至少可以说它们不在ReleaseCandidate中)。缺少的文件是dbnetlib.dll和DbgIpcPlatMan.dll。您可以在包含SmartDeviceExtensions(SDE)的MicrosoftVisualStudio®.NET的一个特殊版本中找到这两个文件,而这个版本可以联机订购。如果经过适当配置的、基于WindowsCE.NET的平台上包含所有这些文件,该平台就能够运行.NET可执行文件了。值得注意的是,SDE附带的这一VisualStudio.NET特殊版本与2002年1月上市的最终发布版本并不一样。

运行.NET程序

桌面和WindowsCE上的.NET程序都以普通的Win32PE文件格式发布。也就是说,乍看起来,Win32可执行文件与.NET可执行文件似乎是相同的-应用程序具有.EXE扩展名,而共享库则具有.DLL扩展名。

Win32可执行文件在以下两个方面区别于.NET可执行文件:(1)标题中设置的标志,以及(2)所依赖的库。当操作系统加载器注意到.NET标志时,会调用一个特殊函数,并通过JIT处理器加载MSIL函数。(在WindowsCE.NET上,这个函数的名称为CeModuleJit。).NET可执行文件依赖于MSCOREE.DLL(即它们从MSCOREE.DLL导入函数)。这是支持.NETFramework精简版的本机Win32DLL之一。

要启用.NETFramework精简版,必须存在两项内容:其一是前面描绘的那组文件,其二是支持.NET对象所需的所有WindowsCE组件。例如,必须存在GWES模块,才能支持GUI应用程序。将.NETFramework精简版添加到某个映像中时,PlatformBuilder会自动附加所需的WindowsCE元素。

在PocketPC(或PocketPC2002)上,只需将文件复制到windows目录中,即可完成同样的事情。而且,事实上,这对于任何基于WindowsCE.NET的设备都适用。假定COREDLL.DLL和WINSOCK.DLL的所需部分都存在,则只要存在支持库文件,.NETFramework精简版程序就能运行。

.NETFramework精简版所需的WindowsCE组件

您怎么来判断一个给定的WindowsCE.NET版本是否支持.NETFramework精简版呢?您可能知道,将组件合并到WindowsCE映像时,会设置一个或多个环境变量。在PlatformBuilderIDE中,将组件从目录拖到平台上时,系统会自动定义这些环境变量。尽管IDE提供了一个非常好的图形化视图,但也有其缺点。例如,如何记录系统中的内容、如何比较两个平台或如何判断(就象我们现在要做的一样)某个平台是否满足最低的组件要求?在制作平台映像时,环境变量被写到一个名为CECONFIG.H的文件中。您可以通过查看这组环境变量来准确地判断给定映像中存在的内容。

CECONFIG.H包含一个环境变量列表,用来表明在建立平台时包含的组件。CECONFIG.H自动包含在为平台创建的WindowsCE映像(即NK.BIN)中。这就是说,即使没有建立特定的WindowsCE.NET平台,您仍然可以参考CECONFIG.H文件,了解需要什么组件。有了这个文件之后,下一步就是将那些组件与列表1进行比较。

支持.NETFramework精简版所需的WindowsCE.NET组件

MSCOREE.DLL需要的模块

CE_MODULES_FILESYS

CE_MODULES_GWES

COREDLL_COREMAIN

COREDLL_CORELOC或COREDLL_LOCUSA

COREDLL_FULL_CRT

COREDLL_CORESIOW

NK_NKMAPFILE

GWES_CURSOR或GWES_MCURSOR

GWES_KBDUI

WFINTER.DLL需要的模块

CE_MODULES_GWES

COREDLL_LMEM

COREDLL_GDI_C或COREDLL_MGDI_C

COREDLL_WMGR_C

COREDLL_RECTAPI

GWES_FOREGND

GWES_ICON

GWES_IMGCTL

GWES_MSGQUE

GWES_MGTT或GWES_MGRAST或GWES_GDIFONTS或GWES_PGDI

GWES_MGBITMAP或GWES_PGDI

GWES_MGBLT或GWES_PGDI

GWES_MGBLT2或GWES_PGDI

GWES_MGBASE或GWES_PGDI

GWES_MGDRAW

GWES_MGDRAW或GWES_PGDI

GWES_MGDRWTXT或GWES_PGDI

GWES_MGPAL

GWES_MGRGN或GWES_PGDI

GWES_NCLIENT

GWES_SBCMN

GWES_TIMER

GWES_WMBASE

GWES_WINMGR

DBNETLIB.DLL需要的模块

COREDLL_COREMAIN

COREDLL_CORELOC或COREDLL_LOCUSA

CE_MODULES_FILESYS

COREDLL_FULL_CRT

DBGIPCPLATMAN.DLL需要的模块

COREDLL_LMEM

小结

那么,何时应该使用.NETFramework精简版API,何时又应该使用Win32API呢?对于以下核心组件,您需要使用Win32API:设备驱动程序、控制面板小程序、命令解释程序扩展以及OEM适配层。您也可以将Win32API用于无头的(基于HLBASE的)平台,或用于必须在特别小的内存空间中运行的任何平台。

对于所有其他情况,在创建用于WindowsCE.NET或更高版本的GUI应用程序时,都应该使用.NETFramework精简版。尤其是,客户端应用程序(窗口、菜单、对话框、控件)最适合.NETFramework精简版。需要访问Web服务的应用程序(即Web服务客户端)也是如此。对于上述任何一种应用程序,.NETFramework精简版都是理想的选择。而且,由于与桌面.NETFramework高度兼容,建立桌面.NETFramework应用程序的.NETFramework精简版就特别简单。

总之,只要有机会,都应该编写.NETFramework精简版应用程序。新的C#编程语言、新的VisualStudio.NET开发环境、针对WindowsCE的SmartDeviceExtensions(SDE)以及更新的WindowsCE.NET模拟器,所有这些构成了一个充满乐趣、高效易用的开发环境。

缩写和术语

API应用程序编程接口

CHTMLCompactHTML

CIL公共中间语言

CLI公共语言接口

CLR公共语言运行库

CTS公共类型系统

HTML超文本标记语言

MFCMicrosoft基础类

MMITMicrosoftMobileInternetToolkit

MSILMicrosoft中间语言

OALOEM应用程序层

SDESmartDeviceExtensions

VBVisualBasic

WAP无线应用协议

Win32Windows32位应用程序编程接口

WML无线标记语言

XML可扩展标记语言

更多信息

要获得最新的WindowsCE.NET开发人员信息,请访问:

开发人员信息

产品信息

社区提示和技巧

WindowsCE.NET附带的联机文档和上下文相关帮助也提供了有关使用WindowsCE.NET的全面的背景信息和说明。

要访问联机文档:

打开PlatformBuilder4.0。

要查看文档,请在Help(帮助)菜单上选择Contents(目录)选项卡。
注意:
请从MSDN上的WindowsEmbedded下载中心安装最新的WindowsCE.NET产品帮助文件更新。

MicrosoftWindowsEmbedded开发人员中心

您始终可以在MSDN®WindowsEmbedded开发人员中心找到最新的开发人员信息,包括有关WindowsCE.NET的新闻、产品文档、技术文章、专栏、基本操作、下载、代码示例、修复程序和更新。

加入、共享和开发WindowsEmbedded社区

请访问WindowsEmbedded社区,获得帮助您跟上平台技术的发展步伐的资源,包括提示和技巧、聊天、新闻组、特性下载等。您还可以共享您的开发经验,从有价值的对等支持关系中获益,以及找到许多WindowsCE.NET相关问题的答案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐