「玩一玩」Write Once, Run Anywhere:這不是Java,這是C#


我不怎么玩Linux,只是把自己遇到的寫出來。
既然大家那么喜歡分,這次我就多放100分出來。。本來我只習慣放88分的。。
凡是純接分純表情無意義復制粘貼的。。嘿嘿。。反正我不怎么接貼的。。
---------------------------
© Conmajia 2012

“Write once, run anywhere”(一次編寫,到處運行,WORA),有時也寫成“Write once, run everywhere”(WORE),是Sun Microsystem(於2010年被Oracle收購)為宣傳Java語言的跨平台特性而提出的口號。在理想情況下——當然常常是不可能的——將Java語言寫成的程序編譯為標准的字節碼(bytecode),就可以運行在支持Java虛擬機(JVM)的任何設備上。

很多半吊子的Java“專家”常常用這點來擠兌.NET的使用者,說他們“被微軟綁架了,只有JVM這種業界標准才能跨平台”。

真實的情況是什么呢?一方面,真正的Java開發者不斷抱怨着“Write once, debug anywhere"(一次編寫,到處調試),另一方面,越來越多的人認識到.NET的本質實際是CLS,也是業界標准,CLR也是虛擬機。所以,總是在“跨平台”的能力上突出Java而貶低.NET,已經是落伍和壓根不懂的表現了。

最近我因為電腦運行速度慢,於是刪除了Windows,轉而安裝Linux Mint(一個基於Ubuntu的Linux發行版)。

在Linux環境下,有很出名的.NET運行時——Mono。
盡管對於已經廣泛使用的技術(如.NET)而言,運行時的文件大小已經沒有太大的討論意義,但是從有人拿這個說事。那么Mono的表現又如何呢?
Mono的完全安裝大小為78MB(Java最小安裝尺寸95MB),而Mono最小化安裝之需要7MB。(參考文獻: http://www.infoq.com/cn/news/2007/07/Mono-Runtime-Size
Mono的大名,搞.NET的朋友相信都知道。它使.NET程序在Linux(還有Mac OS版本)下有了跨平台運行的可能。Mono目前支持到.NET v3.5,已經逐漸趨於穩定和流行了。由於我只會C#(慚愧),因此需要在Linux下開發和運行.NET程序,於是安裝Mono運行時。
$ sudo apt-get install mono-gmcs libmono-system-data2.0-cil libmono-system-ldap2.0-cil libmono-system-messaging2.0-cil libmono-system-runtime2.0-cil  

為了能夠方便開發,我直接安裝了MonoDevelop。這是Windows上大名鼎鼎的開源.NET IDE SharpDevelop的Linux版本。

安裝命令如下:
$ sudo apt-get install monodevelop  

下面是幾個簡單的程序測試。注意,這里的程序代碼在Windows下是完全可以運行的。

命令行程序
    using System;  
        
     namespace Test  
     {  
         class Program  
         {  
             static void Main()  
             {  
                 Console.WriteLine("Hello Mono!");  
                 Console.ReadLine();  
             }  
         }  
     }  

運行結果

WinForm程序
    using System;  
     using System.Windows.Forms;  
       
     namespace test  
     {  
         public class MainForm:Form  
         {          
             TextBox textBox1;  
             Button button1;  
             public MainForm ()  
             {  
                 textBox1=new TextBox();  
                 textBox1.Text="Text here...";  
                 textBox1.Location=new System.Drawing.Point(10,10);  
                 button1=new Button();  
                 button1.Text="Click me.";  
                 button1.AutoSize=true;  
                 button1.Location=new System.Drawing.Point(10,40);  
                 this.Controls.Add (textBox1);  
                 this.Controls.Add (button1);  
             }          
         }  
     }  

運行結果

是不是很意外,某些Java“磚家”?Linux下面可以直接運行WinForm的程序。就是這么方便。演示代碼是在Linux下編譯的,還不能證明“Write once, run anywhere”,那么,就直接運行Windows下編譯出來的exe又如何?

下面是我之前在Windows下用Visual Studio和SharpDevelop編譯的exe不做任何處理(也沒法處理)直接運行。

首先是《蜂巢大戰》,先來看看Windows下運行的效果。

然后是在Linux下運行。

注意:因為默認.exe是和歸檔管理器關聯的,所以需要選擇打開方式為“Mono Runtime”。
運行效果如下

經測試各種功能正常。說明GDI+工作正常,ToolStrip等控件也運行正常。

再來看看我最近發表的另一個程序:《InvokeHelper》。

Windows下是這樣的

在Mono環境下運行是這個效果

說明和線程相關的功能工作正常。

再來是和Windows API相關的。其實用腳指頭想也是不可能的(不光C#,隨便什么語言都一樣,這種和平台API強相關的,怎么可能“跨平台”呢)。

《獲取系統圖標》,這個程序使用了SHGetFileInfo這個Windows API:
    [DllImport("Shell32.dll")]  
     static extern int SHGetFileInfo(  
       string pszPath,  
       uint dwFileAttributes,  
       ref   SHFILEINFO psfi,  
       uint cbFileInfo,  
       uint uFlags  
     );  

在Windows中工作正常

在Linux下如何呢?運行下試試:

調用打開文件對話框正常,但是一旦運行到Windows API就自動退出。所以,跨了平台后,和平台(Win)相關的API不能用了,這也是理所當然的。C#和Java都沒辦法跳掉這樣的命運(笑)。

總結

目前比較有名的非Windows平台下.NET虛擬機/運行時暫時只有Mono一家,相信隨着時間推移,會有更多的Runtime出現,Mono也會變得更強大。到時,不止是Java,C#還有.NET平台下的各種語言(VB、C++/CLI、F#等)都可以實現“Write once, run anywhere”了。當然,還有隨之而來的“Debug anywhere”(笑)。

(完)

© Conmajia 2012

504 个解决方案

#1


該回復於2012-08-22 08:06:59被版主刪除

#2


除Windows外,還沒有其他操作系統上有穩定版本的.Net Framework環境,提供給.Net 程序來運行。Linux上的Mono項目只實現了.Net Framework 1.1的規范,遠遠落后於Windows平台。

#3


圖片都掛了

#4


恩,前段時間我也在ubuntu下搗鼓.net了。最后是花費了大量的時間精力才在ubuntu下搭建起.net開發環境。

為什么呢?原因有下:

linux與windows相比,版本眾多,不同的發行版本,差別還是比較大的。軟件平台的搭建方法也不一樣。我最開始裝的ubuntu11.04可是裝上monodevelop后運行不起來。后來更新了一個版本才弄好。現在我期待12.04 LTS能有穩定版本。弄過來好好學習一下。

相關資料太少了。我英語不是很強,大多先搜索中文的資料。可是中文關於linux下跑winform的東西真是少之又少。不像windows的東西,網上一搜一大吧。

后來,我的實驗卡在編譯emgucv那步了。.net的一些文件都編譯過去了。可是opencv的一些文件貌似沒編譯過去。emgucv的示例程序都跑不起來。后來就沒有后來了。

總之,希望ubuntu的發行版本更穩定,mono更強大。

#5


.net 到現在為止,已令java望塵莫及了。
正如樓主所言 “.NET的本質實際是CLS,也是業界標准,CLR也是虛擬機”
.net 是虛擬機,可以直接在硬件上運行,可以不需要操作系統一層。如 .NET Micro Framework。
如果了解的越多,越可知微軟的眼光的長遠 與 野心,不是那些整天噴微軟的人所能理解的。
Mono 實現了跨操作系統
win8 實現了跨硬件設備
.NET Micro Framework 不再需要操作系統
下一步,將會是什么呢? 。。。請樓下的聰明人回答

#6


引用 2 樓  的回復:
除Windows外,還沒有其他操作系統上有穩定版本的.Net Framework環境,提供給.Net 程序來運行。Linux上的Mono項目只實現了.Net Framework 1.1的規范,遠遠落后於Windows平台。
可能你需要關注下mono的進展情況,你的信息有點遠遠落后了。。
如你所見,目前的MONO支持范型(2.0+)和var(3.0+)

#7


Mono是個不錯的東西。

#8


引用 2 樓  的回復:
除Windows外,還沒有其他操作系統上有穩定版本的.Net Framework環境,提供給.Net 程序來運行。Linux上的Mono項目只實現了.Net Framework 1.1的規范,遠遠落后於Windows平台。


你這說的是哪個年代的老皇歷了?Mono 1.0年代??

你睜大眼睛看看吧,我真不想罵你。如果您不知道,咱們可以互相學習互相探討。可是您明明不了解卻還言之鑿鑿地詆毀Mono,這是我真心想罵你的地方。

Mono在其上一個stable release Mono 2.6.7的時候就已經兼容到.Net 3.5了。
Mono現在的穩定版本2.10.8已經兼容到標准.Net的4.0了。
您老先生還停留在.Net 1.1呢。

http://www.mono-project.com/Compatibility

至於Mono的穩定性,質疑的人請你親自去做測試。我是親自做過測試而且用Mono 2.10做過實際項目的。

#9


貌似很純潔...很厲害的樣子..

前排..

#10


該回復於2012-08-22 09:07:11被版主刪除

#11


引用 8 樓  的回復:
引用 2 樓  的回復:
除Windows外,還沒有其他操作系統上有穩定版本的.Net Framework環境,提供給.Net 程序來運行。Linux上的Mono項目只實現了.Net Framework 1.1的規范,遠遠落后於Windows平台。


你這說的是哪個年代的老皇歷了?Mono 1.0年代??

你睜大眼睛看看吧,我真不想罵你。如果您不知道,咱們可以互相學習互相探討。可……
看6樓

#12


引用 4 樓  的回復:
恩,前段時間我也在ubuntu下搗鼓.net了。最后是花費了大量的時間精力才在ubuntu下搭建起.net開發環境。

為什么呢?原因有下:

linux與windows相比,版本眾多,不同的發行版本,差別還是比較大的。軟件平台的搭建方法也不一樣。我最開始裝的ubuntu11.04可是裝上monodevelop后運行不起來。后來更新了一個版本才弄好。現在我期待12.04 LTS能有穩定版……



其實,我覺得你遇到的困難,最大的原因可能是你英文不太熟,嘿嘿

我折騰Mono的時候,基本上沒遇到什么大的坎。也遇到過,一般都是我自己瞎折騰,明明有二進制的現成的安裝包,我非要自己拿源碼編譯一個出來,結果處理了好多庫的依賴,但也都最終解決了。這是我不太順利的地方。用現成的編譯好的安裝包來進行安裝,沒遇到過大麻煩。

總之在Linux上折騰Mono環境比折騰Java環境更順利。有人說Java有傻瓜安裝包,一鍵搞定,那么Mono也有傻瓜安裝包,用apt-get,一鍵搞定運行環境和開發環境。

我折騰Mono的時候只看英文文檔。估計你看的中文文檔沒我看的英文文檔全面。

#13


引用 5 樓  的回復:
.net 到現在為止,已令java望塵莫及了。
正如樓主所言 “.NET的本質實際是CLS,也是業界標准,CLR也是虛擬機”
.net 是虛擬機,可以直接在硬件上運行,可以不需要操作系統一層。如 .NET Micro Framework。
如果了解的越多,越可知微軟的眼光的長遠 與 野心,不是那些整天噴微軟的人所能理解的。
Mono 實現了跨操作系統
win8 實現了跨硬件設備
.NET Micro Framework 不再需要操作系統
下一步,將會是什么呢? 。。。請樓下的聰明人回答



現在Mono社區的人都在翹首以盼,期待着Mono 2.12和Mono 3.0

到了Mono 3.0發布的那一天,世界更美好。

#14


引用 11 樓  的回復:
看6樓


嗯,看到了。

我回帖的時候,這個帖子才剛剛回到第5樓。等回完了一看,都到了第8樓了。


話說,2顆星的大牛(#2樓)說話都這么不靠譜嗎?讓我這5個褲衩的用戶難以淡定呀……

#15


該回復於2012-08-22 09:21:54被版主刪除

#16


該回復於2012-08-22 09:41:53被版主刪除

#17


引用 14 樓  的回復:
引用 11 樓  的回復:
看6樓


嗯,看到了。

我回帖的時候,這個帖子才剛剛回到第5樓。等回完了一看,都到了第8樓了。


話說,2顆星的大牛(#2樓)說話都這么不靠譜嗎?讓我這5個褲衩的用戶難以淡定呀……
恩。。那時我正在想用什么簡單(免得我麻煩)而貼切(免得沒說服力)的例子給大牛看。。。

#18


呵呵,未來將是.net的天下,mono的天下

#19


不懂linux,所以,大開眼界!

#20


引用樓主  的回復:
再來是和Windows API相關的。其實用腳指頭想也是不可能的(不光C#,隨便什么語言都一樣,這種和平台API強相關的,怎么可能“跨平台”呢)。


在這里不得不提到 Mono Migration Analyzer (MoMA)
http://www.mono-project.com/MoMA

這個工具可以直接告訴你將一個現成的基於Windows + Microsoft.Net的程序,移植到Win/Linux/Mac + Mono的可能性。

有時候實現一個小功能,實現方式其實有好多種,但有的實現方式是依賴於Windows API的,有的不是,在不影響性能的前提下,我們要優先選擇標准實現而不是特殊實現。這就是用Mono做項目的成功秘訣。

#21


注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他語言。。所以也就必須用mono。。用的過程中發現比之前聽說的傳聞(比如2#的)要強大好用很多,於是來給它普及一下。

#22


引用 3 樓  的回復:
圖片都掛了


野比兄的圖片是放到了cnblogs上。
如果你有cnblogs的帳號,登錄一下,在電腦上留下cookie,然后就能看到這帖子里的圖了。

#23


Cross Platform - Mono is built to be cross platform. Mono runs on Linux, Microsoft Windows, Mac OS X, BSD, and Sun Solaris, Nintendo Wii, Sony PlayStation 3, Apple iPhone. It also runs on x86, x86-64, IA64, PowerPC, SPARC (32), ARM, Alpha, s390, s390x (32 and 64 bits) and more. Developing your application with Mono allows you to run on nearly any computer in existance (details).

來自
http://www.mono-project.com/What_is_Mono

還可以泡在Wii, 和ps3上。

#24


MonoTouch 好像也不錯。

#25


引用 21 樓  的回復:
注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他語言。。所以也就必須用mono。。用的過程中發現比之前聽說的傳聞(比如2#的)要強大好用很多,於是來給它普及一下。


支持!

#26


在實際工作中用到Mono的地方多嗎,我反正沒用過...

#27


雖然看不懂,感覺很NX

#28


該回復於2012-08-22 10:51:33被版主刪除

#29



Mono  就裝過一次,感覺要裝的東西實在太多,並且下載也慢,具體的代碼沒怎么去體驗。

認真了看了一下野比的描述,確實很強大。有時間再裝一次。

#30


圍觀,

WORA很好很強大!

#31


引用 21 樓  的回復:
注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他語言。。所以也就必須用mono。。用的過程中發現比之前聽說的傳聞(比如2#的)要強大好用很多,於是來給它普及一下。



我不懂C# ,但是看21樓的貼,感覺樓主巨牛逼,天下無敵了。等你學會了其他語言再來說懶得用其他語言,不要挑釁其他語言。

#32


如果微軟能夠為非window的電腦提供net框架集,那C#更加流行

#33


樓上正解

#34


好的很

#35


引用 31 樓  的回復:
引用 21 樓  的回復:

注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他語言。。所以也就必須用mono。。用的過程中發現比之前聽說的傳聞(比如2#的)要強大好用很多,於是來給它普及一下。



我不懂C# ,但是看21樓的貼,感覺樓主巨牛逼,天下無敵了。等你學會了其他語言再來說懶得用其他語言,不要挑釁其他……
我猜你經常用Java。。。都說了我不是要挑起語言爭斗。。用什么語言只是習慣而已。。我說我吃面條習慣用筷子,懶得用叉子和勺子。。你會不會覺得我巨牛逼?。。其實我多少還是會那么幾種語言的。。

#36


但你一個  懶得用  充滿了挑釁


引用 35 樓  的回復:
引用 31 樓  的回復:

引用 21 樓  的回復:

注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他語言。。所以也就必須用mono。。用的過程中發現比之前聽說的傳聞(比如2#的)要強大好用很多,於是來給它普及一下。



我不懂C# ,但是看21樓的貼,感覺樓主巨牛逼,天下無敵了。等你學會了其他語言……

#37


野比兄的圖片是放到了cnblogs上。
如果你有cnblogs的帳號,登錄一下,在電腦上留下cookie,然后就能看到這帖子里的圖了。

#38


引用 36 樓  的回復:
但你一個  懶得用  充滿了挑釁


引用 35 樓  的回復:

引用 31 樓  的回復:

引用 21 樓  的回復:

注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他語言。。所以也就必須用mono。。用的過程中發現比之前聽說的傳聞(比如2#的)要強大好用很多,於是來給它普及一下。



……
這是你不了解我造成的誤會。。我說懶得。。那是真懶。。。懶得換IDE,懶得換compiler,懶得換debugger。。。

#39


看來自己真的是很傻很天真,我也裝了個Mint,往下就是wine了,搞了半天放棄了.
學習了.

#40


公共場合發言要充滿了小心,一不小心就可能成為攻擊的對象

引用 38 樓  的回復:
引用 36 樓  的回復:

但你一個  懶得用  充滿了挑釁


引用 35 樓  的回復:

引用 31 樓  的回復:

引用 21 樓  的回復:

注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他語言。。所以也就必須用mono。。用的過程中發現比之前聽說的傳聞(比如2#的)要強大好用很多,於……

#41


該回復於2014-10-04 09:46:26被版主刪除

#42


引用 40 樓  的回復:
公共場合發言要充滿了小心,一不小心就可能成為攻擊的對象

引用 38 樓  的回復:

引用 36 樓  的回復:

但你一個  懶得用  充滿了挑釁


引用 35 樓  的回復:

引用 31 樓  的回復:

引用 21 樓  的回復:

注意了。我發這個帖子,主要目的不是挑起語言爭斗。。這是X干的事,我等P民干不了。。。主要是因為我只會C#,或者說懶得用其他……
恩。多謝提醒。。我倒不是很在乎。。冒犯到你抱歉了。。

#43


野比兄的圖片是放到了cnblogs上。
如果你有cnblogs的帳號,登錄一下,在電腦上留下cookie,然后就能看到這帖子里的圖了。

#44


要理解MONO的強大,建議先拿Android來實驗,據說用Mono編寫的Android程序,比用Java編寫的運行速度快,而且功能上完全不差,因為都是用的同一套SDK。

#45


來學習學習!

#46


C Sharper何必如此糾結?一會兒對Linux不屑一顧,一會兒又要投奔Linux。

每次宣傳C#的時候都要帶上JAVA,卻又不敢承認C#就是在重復造輪子。

反正我覺得有沒有C#,對我來說都一樣,我不會因為什么人鼓吹C#就去玩C#。

#47


別說是linux, osx了,mono for android, mono for ios 都有了

#48


對linux沒啥接觸...看起來好強力的樣子....

#49


對linux沒啥接觸...看起來好強力的樣子....

#50


引用 46 樓  的回復:
C Sharper何必如此糾結?一會兒對Linux不屑一顧,一會兒又要投奔Linux。

每次宣傳C#的時候都要帶上JAVA,卻又不敢承認C#就是在重復造輪子。

反正我覺得有沒有C#,對我來說都一樣,我不會因為什么人鼓吹C#就去玩C#。
嘿,繼續啊。。這么好幾句就說完啦。。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com