C++ / C#及Framework的選擇

最近想寫個Windows程式來玩玩順便練功
不過在選擇程式語言/Framework的時候卻傷透腦筋….


= C# =
一開始我是想說寫C#好了
VB什麼的就算了,自從十幾年前C寫習慣之後Basic語法用起來就覺得憋扭
然後C++又很煩人,得花費好多時間在處理一些鎖碎的事上
所以就C#吧,雖然沒寫過還得學一下,不過剛好可以學點新東西也不錯

= Native C++ =
C#得在.Net Framework下執行,雖然不挺好但也還能接受,反正這幾年下來大家的電腦裏可能都已經有.Net Framework了。但比較讓人在意的是他compile出來的程式是bytecode,而不像C++是native machine code,要寫一些比較重視速度的軟體就不是很理想。
於是又想說如果刻苦一點用C++寫,雖然這樣開發速度慢吞吞,不過多用多熟對平常工作有幫助的話也是還可以接受。

Windows的程式好久沒寫了,古時候也都是寫VB,還得調查一下寫C++用什麼framwork或API比較好。

首先得先搞定一些名詞:
* VC (Native, unmanaged)
– Win32 API
Win32的底層API
– MFC (Microsoft Foundation Classes)
– ATL (Active Template Library)
– WTL (Windows Template Library )
a C++ library for developing Windows applications and UI components. It extends ATL (Active Template Library) and provides a set of classes for controls, dialogs, frame windows, GDI objects, and more.

* VC.NET (managed / Mixed mode)
– .Net/CLR (Common Language Runtime ), Managed
.Net的底層API
– Managed C++ (Managed Extensions for C++)
now deprecated, Visual Studio 2005後被C++/CLI取代
– C++/CLI (Common Language Infrastructure)
—————
– WinForm (Windows Form)
相對於WPF,較為傳統調整較少
底層使用GDI+
搭配CLR用
– WPF (Windows Presentation Foundation)
使用XAML語言開發界面
底層使用DirectX
搭配CLR用
– Silverlight
由WPF/E(WPF的子集)演化而來(XAML/Javascript)
Adobe Flash的競爭產品
不是.Net的一部份,只是跟WPF相關就順便一下

總之,C++要作出Native code,.net的東西都不能用
就只能用MFC啦

= WinRT =
再來因為這兩年Windows 8搞出了Metro Style APP (Windows Store APP),所以還得考慮一下用那種方式寫到時比較好移植

– WinRT
Metro Style APP的底層API
– WRL (Windows Runtime C++ Template Library), Native
an ATL-style template library
a template library that provides a low-level way to author and use Windows Runtime components.
– C++/CX (C++ Component eXtension)
語法是C++/CLI的子集,但並不會使用CLR
目前只能用來寫Windows Store Apps
– .NET/CLR
– XAML (Extensible Application Markup Language), Native
the successor to WPF and Silverlight
可搭配C++/CX或.Net
目前只能用在WinRT,不支援Win32

這下可好,C++又復活了,UI竟然可以搭配XAML,而且作出來的還是Native code。

不過問題來了,不管是用C++或用C#(.Net),想寫個傳統Desktop (Win32)跟Metro (WinRT)之間容易移植的程式,看起來也是很頭大啊。
雖然XAML感覺是不錯,可是…Win32下沒有這玩意可用啊。

= Other Frameworks =
以前在Linux下寫過C++/QT的程式,覺得QT實在很好用,UI的部份他的designer用起來很方便(可以像VB那樣用拖拉的作UI,不用寫code),然後QT的framework不止提供UI,還提供了一些C++原本沒有的東西,讓C++寫起來輕鬆許多。像QString處理字串超開心,Signal/Slot用起來也超方便(雖然不是C++標準語法)。然後又是跨平台,移植很方便。
可是QT作出來的介面都不是系統的原生介面,雖然他已經儘量把自己作的”看起來”跟原生介面很像了,可是也只是很像而已,作出來的程式用起來就不是那麼的舒服(就像是java的程式的感覺)

考慮到這點,WxWidgets就比較符合需求,因為他在各OS下作出來的都是原生介面。雖然他一些整合沒有QT那麼好,而且也不像QT有Nokia在後頭撐腰。

不過呢,不管是QT、WxWidgets或其它這類型的framework,通通都沒辦法作出Metro APP啦。

= .Net移植的問題 =
.Net有個問題就是要移植到其它平台可能會挺頭痛。
雖然Net的程式跟java一樣是bytecode,理論上有VM的話在什麼平台跑都行。但現實情況是MS的.Net只出給Windows用。
雖然Linux下也有Mono Framework可以跑.Net程式
但Mono Framework跟.Net也不是完全相容,像是WPF就完全不支援,搭配WDF寫的程式就全死了

= 總之 =
* 最精實的方法
用C++寫
Win32搭配WxWidgets,至少有designer可用,總比直接用MFC硬幹要輕鬆的多了,要移植到Linux也沒問題
WinRT用C++/Cx搭配XAML,移植想必一堆東西得重寫過就是

* 最快速的方法
用C#寫,其它全不管了
忘了Linux吧!反正Linux desktop我自己又不太用
忘了WinRT吧!反正主要也只是想在平板上用觸控操作
那就把Win32程式的介面設計成觸控的操作方法就好了嘛~
不過這樣就對不起了~用Windows RT的各位!(指的是ARM CPU的windows機器)

* 折衷的方法
先用C#/WPF寫Win32程式
之後如果有需要的話,部份改用C++/MFC寫DLL改善效能
扯到WPF的話Linux沒戲,這邊放棄
WinRT的話UI是肯定得重寫了,不過應該會比完全用C++寫還得改C++/Cx來的輕鬆。
得注意WinRT只支援部份Win32 API就是。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *