色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

Windows Mobile開(kāi)發(fā),Native C++ PK .NET Compact Framework

緣由

經(jīng)常聽(tīng)到一些剛剛接觸Windows Embedded CE和Windows Mobile開(kāi)發(fā)的人會(huì)提出一些疑問(wèn)。進(jìn)行Windows Mobile開(kāi)發(fā),到底使用什么語(yǔ)言呢?C++還是C#?Java行不行?下面就我自己的想法講述一下Native C++ 和 .NET Compact Framework的異同和選擇。

 

什么是Native

Native翻譯成原生,Native是使用C,C++或者匯編等語(yǔ)言代碼編寫(xiě)的,編譯成處理器相關(guān)的binary文件(執(zhí)行文件,DLL等可執(zhí)行文件), 關(guān)于可執(zhí)行文件可以參考http://en.wikipedia.org/wiki/Portable_Executable 。當(dāng)前Windows Embedded CE和Windows Mobile支持的硬件平臺(tái)包括x86, MIPS, ARMSuperH。由于各個(gè)平臺(tái)之間的指令集不一樣,所以可執(zhí)行文件不能互相支持其他平臺(tái)。使用Native 開(kāi)發(fā),程序不依賴于任何其他子系統(tǒng),例如.NET Compact Framework運(yùn)行環(huán)境,JVM運(yùn)行環(huán)境等,但是一套程序必須為各個(gè)硬件平臺(tái)編譯不同的可執(zhí)行文件。

 

什么是.NET Compact Framework

基于.NET Compact Framework開(kāi)發(fā)的程序,可以叫做托管程序,英文叫做Managed code。所謂Managed code就是使用C#,VB.NET語(yǔ)言來(lái)編寫(xiě)代碼,使用.NET Compact Framework來(lái)開(kāi)發(fā),編譯成平臺(tái)無(wú)關(guān)的中間語(yǔ)言(Intermediate Lanuage, IL)的文件的程序。基于.NET Compact Framework開(kāi)發(fā)的程序,在編寫(xiě)的時(shí)候會(huì)使用到.NET Compact Framework 基礎(chǔ)類庫(kù)(.NET Compact Framework Base Class Libraries, BCL) ,BCL為應(yīng)用程序提供API。托管程序在運(yùn)行的時(shí)候會(huì)使用到運(yùn)行時(shí)執(zhí)行引擎(run-time Execution Engine, EE), BCL和EE統(tǒng)稱為Common Language Runtime (CLR)。當(dāng)托管程序首次執(zhí)行的時(shí)候,CLR會(huì)把IL文件編譯成相關(guān)平臺(tái)的binary文件(可執(zhí)行文件)。這個(gè)過(guò)程叫做Just-In-Time (JIT) compilation。由于有了這一個(gè)過(guò)程,所以所有托管代碼都依賴于CLR,因此,需要運(yùn)行托管代碼的設(shè)備必須安裝 .NET Compact Framework。

Native-Managed-01

圖來(lái)自于Windows Embedded CE 6.0 Fundamentals Chapter 9.

 

通俗化Native Code vs. Managed Code

上面講述了一堆理論的東西,下面使用一個(gè)通俗但不是很貼切的例子講述Native和Managed,Native翻譯成原生,其實(shí)有地道的,與生俱來(lái)的意思,例如你天生說(shuō)普通話,那么可以說(shuō)你是Mandarin Native Speaker。也就是與生俱來(lái)說(shuō)普通話,地地道道的普通話。如果你要做一些語(yǔ)言相關(guān)的產(chǎn)品進(jìn)行銷(xiāo)售,如果你在銷(xiāo)售產(chǎn)品之前把之翻譯成各個(gè)語(yǔ)言,例如在國(guó)內(nèi)銷(xiāo)售翻譯成中文,在美國(guó)翻譯成英文,在日本翻譯成日文,這好比你使用Native Code來(lái)開(kāi)發(fā),在編譯時(shí)已經(jīng)為各個(gè)硬件平臺(tái)生成原生的機(jī)器代碼。但是Managed(托管)代碼就好比世界語(yǔ),世界上沒(méi)有那個(gè)民族和地區(qū)天生就說(shuō)世界語(yǔ),但是你使用世界語(yǔ)來(lái)銷(xiāo)售你的產(chǎn)品。針對(duì)每個(gè)不同國(guó)家和地區(qū),你附送一個(gè)及時(shí)翻譯機(jī),這個(gè)翻譯機(jī)會(huì)在用戶使用的時(shí)候把世界語(yǔ)翻譯成當(dāng)?shù)卦Z(yǔ)言。這就好比基于.NET Compact Framework開(kāi)發(fā)的代碼,需要CLR來(lái)翻譯執(zhí)行。這里注意不同硬件平臺(tái)CLR是不一樣的,他們功能都是把IL編譯成Native的機(jī)器碼,但是各個(gè)平臺(tái)的機(jī)器碼不一樣,所以.NET Compact Framework也不一樣。.NET Compact Framework幫你處理了平臺(tái)差異性,因此.NET Compact Framework的程序是跨平臺(tái)的,就像世界語(yǔ)加上翻譯機(jī)那樣,基于.NET Compact Framework編寫(xiě)的代碼可以支持任何平臺(tái),前提是微軟為具體平臺(tái)實(shí)現(xiàn)CLR。例如大家都知道Yahoo,其實(shí)世界上有一種快要消失的語(yǔ)言就叫做Yahoo,如果你做一個(gè)世界語(yǔ)到Y(jié)ahoo語(yǔ)的翻譯機(jī),那么你的產(chǎn)品可以不做任何修改就賣(mài)到講Yahoo語(yǔ)的地方了。

 

理論講Native Code vs. Managed Code

Native Code

Managed Code

編譯成平臺(tái)相關(guān)的機(jī)器碼編譯成IL(Intermediate Language)
一次編譯,各種設(shè)備到處運(yùn)行為各個(gè)不同設(shè)備編譯不同版本
不需要其他框架支持(相對(duì)于.NET Compact Framework來(lái)說(shuō))需要CLR支持,也就是需要安裝.NET Compact Framework Rumtime
可以最大限度的訪問(wèn)系統(tǒng)提供的API和服務(wù)只能訪問(wèn).NET Compact Framework 提供的服務(wù),例如WIFI和Bluetooth,.NET Compact Framework 的BCL不提供支持,所以如果只是使用.NET Compact Framework 是不能進(jìn)行WIFI和Bluetooth的開(kāi)發(fā)的。
由于有上述的限制性,所以微軟提供P/Invoke來(lái)訪問(wèn)平臺(tái)相關(guān)的API和COM。
可以使用MFC,ATL,WTL,STL等庫(kù)進(jìn)行開(kāi)發(fā)可以使用.NET Compact Framework 的BCL進(jìn)行開(kāi)發(fā)

 

 

如何選擇Native Code和Managed Code

了解了Native Code 和 Managed Code的異同,可以根據(jù)其特點(diǎn)和相應(yīng)的需求進(jìn)行選擇。沒(méi)有絕對(duì)的好壞,所以才存在兩個(gè)平臺(tái)同時(shí)存在的現(xiàn)狀。

 

Native Code開(kāi)發(fā)速度相對(duì)慢一些,因?yàn)闆](méi)有.NET Compact Framework 的Base Class Libraries的支持。BCL為開(kāi)發(fā)者做了大量的封裝,例如Garbage Collection,Windows form,Web Service等等。基于BCL開(kāi)發(fā)者可以專注于業(yè)務(wù)的開(kāi)發(fā)。所以使用.NET Compact Framework一般來(lái)說(shuō)可以節(jié)省不少開(kāi)發(fā)時(shí)間。時(shí)至今日,庫(kù)對(duì)語(yǔ)言的影響越來(lái)越多,如果沒(méi)有RoR,Ruby可能還是一個(gè)籍籍無(wú)名的日本方言。C++之父Bjarne Stroustrup說(shuō),C++的擴(kuò)展更多的在STL的擴(kuò)展,通過(guò)STL來(lái)支持新特性,以此C++從語(yǔ)法上一直沒(méi)有大變化,但是由于STL的不斷擴(kuò)展而不斷帶來(lái)新的活力。可見(jiàn)庫(kù)對(duì)一個(gè)語(yǔ)言和開(kāi)發(fā)人員的重要性。在這方面.NET Compact Framework 勝出,但是Native C++還是可以通過(guò)MFC,ATL,WTL,STL來(lái)補(bǔ)救。我本人十分喜歡使用WTL處理界面和大量使用STL,關(guān)于WTL,可以參考:

Windows Mobile和Wince(Windows Embedded CE)下的WTL(Windows Template Library)開(kāi)發(fā)

Windows Mobile 和 Wince(Windows Embedded CE) 下的 WTL(Windows Template Library) 界面(UI)開(kāi)發(fā)

Windows Mobile和Wince下使用WTL進(jìn)行Windows Media Player開(kāi)發(fā)

 

關(guān)于在今日插件使用WTL的問(wèn)題

 

Windows Mobile下使用Native C++(WTL, MFC, Win32)開(kāi)發(fā),如何為對(duì)話框加入菜單

Windows Mobile下如何去掉WTL對(duì)話框CStdDialogImpl的OK按鈕

在Windows Mobile下使用WTL進(jìn)行Native C++開(kāi)發(fā),如何顯示等待圖標(biāo)

在Windows Mobile和Wince(Windows Embedded CE)下進(jìn)行WTL開(kāi)發(fā),如何加入超鏈接(HyperLink)

 

但是Native Code執(zhí)行速度相對(duì)快,因?yàn)榛?NET Compact Framework 的代碼有JIT的過(guò)程,第一次執(zhí)行需要把IL編譯到Native機(jī)器碼,而Native Code本身就是機(jī)器碼,所以Native Code快很多。

 

同時(shí)Native Code使用的memory footprint也少很多很多,Native Code使用的footprint只是和你編寫(xiě)的代碼分配內(nèi)存有關(guān)。但是基于.NET Compact Framework 的代碼,盡管一個(gè)幾乎沒(méi)有任何功能的程序,啟動(dòng)的時(shí)候也需要1到2M的內(nèi)存。這些內(nèi)存用于處理Garbage Collection等用途。

 

Native Code和Managed Code存在一個(gè)可控性的gap,.NET Compact Framework 是.NET Framework的精裝版,封裝了一部分.NET Framework的功能,但是不完全包含.NET Framework的所有功能。Native Code具有完全訪問(wèn)系統(tǒng)API和服務(wù),平臺(tái)API的能力,而.NET Framework不完全具備,.NET Compact Framework 就更加不具備,所以從系統(tǒng)可操控性來(lái)說(shuō),Native Code和Managed Code存在一個(gè)gap,這個(gè)gap是指有些功能Native Code可以做,但是Managed Code卻無(wú)法實(shí)現(xiàn)的功能,例如WIFI,Bluetooth。要在.NET Compact Framework 實(shí)現(xiàn)這些功能必須通過(guò)P/Invoke來(lái)實(shí)現(xiàn),關(guān)于P/Invoke可以參考一下

.NET Compact Framework 下Win32 API P/Invoke 的使用

開(kāi)發(fā)P/Invoke的工具與Website

如何在Windows Mobile下使用Native C++動(dòng)態(tài)加載DLL

Windows Mobile和Wince(Windows Embedded CE)下如何封裝Native DLL提供給.NET Compact Framework進(jìn)行調(diào)用

Windows Mobile和Wince(Windows Embedded CE)下封裝Native DLL進(jìn)一步探討

在Windows Mobile和Wince(Windows Embedded CE)下封裝Native DLL的回調(diào)函數(shù)

由于這個(gè)可控性的gap的存在,所以出現(xiàn)了OpenNETCF的Smart Device Framework32feet.NET等庫(kù),這些庫(kù)為基于.NET Compact Framework的程序封裝了P/Invoke的調(diào)用,這樣減少了gap的存在。32feet.NET可以參考  基于32feet.NET對(duì)Broadcom(Widcomm) stack藍(lán)牙(Bluetooth)設(shè)備開(kāi)發(fā)Windows Mobile與PC程序 等系列文章。當(dāng)然微軟也不斷的在填補(bǔ)這個(gè)gap,.NET Compact Framework的不斷升級(jí),這個(gè)gap越來(lái)越小了,例如.NET Compact Framework 1.0沒(méi)有串口操作,但是在.NET Compact Framework 2.0已經(jīng)加上。可是.NET Compact Framework的rumtime就越來(lái)越大,同時(shí)啟動(dòng)也越來(lái)越慢,任何都是均衡,移動(dòng)設(shè)備受到CPU速度和內(nèi)存的限制,.NET Compact Framework 并不是加入越多功能越好。過(guò)猶不及,中國(guó)人常說(shuō)的。

 

Balabala...說(shuō)那么多還是沒(méi)有說(shuō)到底如何選擇,其實(shí)是trade-off(均衡),沒(méi)有絕對(duì)真理,還是根據(jù)具體需求,結(jié)合上述Native Code和Managed Code的特點(diǎn)來(lái)選擇。我自己的經(jīng)驗(yàn),如果速度要求快,內(nèi)存要求少的核心模塊都是使用Native C++(一般包括無(wú)界面,純數(shù)據(jù)處理的程序和完全自定義界面的GDI程序),其他模塊都用.NET Compact Framework。如果一個(gè)模塊需要大量使用P/Invoke,也是需要考慮使用Native C++來(lái)代替.NET Compact Framework的。目前覺(jué)得選擇還是OK的。

 

寫(xiě)到這里,希望看官能明白,有疑問(wèn)請(qǐng)回復(fù)交流。下午Christmas party, happy去。

NET技術(shù)Windows Mobile開(kāi)發(fā),Native C++ PK .NET Compact Framework,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久治县| 句容市| 大城县| 马公市| 治多县| 慈利县| 苏尼特左旗| 定日县| 察隅县| 阿坝| 广元市| 怀远县| 白银市| 辽宁省| 曲麻莱县| 福安市| 巴马| 淮滨县| 九龙县| 阿拉善盟| 宽城| 元谋县| 云阳县| 建湖县| 运城市| 双辽市| 阿拉善左旗| 根河市| 福建省| 台湾省| 思茅市| 乐安县| 外汇| 莒南县| 凤城市| 奉新县| 博白县| 凤翔县| 科技| 中超| 福海县|