今天一上班就看到這樣一篇文章,感覺不爽。且不說有沒有什麼實質的內容,但是作者那不可一世的口氣,嘿嘿,我就想抽他。 (<--於本文發布5小時後重申一下,這句話是我故意加上去的,這是我的真實感受,沒必要虛偽。有不服的可以聯絡我周末找一天PK一下,嘿嘿。)
首先,概念要清楚。CLI是跨平台的,是一個標準,由微軟提議,ECMA進行標準化。
而.NET,則是微軟在Windows平台上對於CLI的實現。同時微軟還實現了一個叫做Rotor的東西,是CLI標準在FreeBSD平台上的實現,同時還將它通過共用原始碼計划進行了開源。同樣,Mono則是某開源組織在Linux平台上對CLI的實現。
現在情況就很明朗了,不管是.NET也好,Mono也好,還是Rotor也好,都是在特定平台上,對一個統一標準的實現。那麼,其中符合標準中強制規定的特定的部分,肯定是跨平台的。而對於標準進行的擴充,就不一定可以跨平台了。
換句話說,.NET中對於部分Windows API進行的封裝,是屬於對CLI標準的擴充,是有可能不跨平台的,你既然選擇使用這些特性,就必須承擔不能跨平台的風險。
同樣,如果的程式裡用到了Mono中對於標準進行擴充的部分,那他同樣不一定能在.NET下運行。(此時,你能說Mono跨平台是個笑話嗎?你會不會罵開源組織很笨?)
再換言,我敢擔保HelloWorld程式編譯好以後,肯定能同時在.NET /Mono/Rotor上運行。
------------------
順便,我不知道是誰第一個開始宣揚.NET是跨平台的(.NET 安裝需求中明確寫出了只支援Win98以上的Windows系列作業系統)。我猜想箇中原因有二。
其一,微軟之“跨平台”不同於業界之“跨平台”。
微軟所謂“跨平台”,指的是在各Windows版本之間跨平台。不要笑,這是很嚴肅的,Windows曆史上有過16位的、32位的、基於NT的各種版本,而你之所以今天還能在WindowsXP上玩DOS遊戲,這離不開微軟各作業系統上的相容性,這種相容性談何容易。跨各種Windows平台也不是一件容易的事。
其二,跨平台的是CLI而不是.NET。
本文一開頭就明確了這些概念。
------------------------
再說一下,如果要開發跨平台的產品,必須首先對各種技術進行評估。文章開頭提到的文章中提到的情況,明顯屬於項目初期的規劃問題。為什麼在項目開始不去進行一些評估?