2011-02-14 48 views
5

我有一位朋友是一位認真的Linux開發人員,但現在他正在使用Windows上的C#並且非常喜歡它。我被C#吸引,因爲像Java一樣,我應該能夠在一個系統上編譯並在任何地方運行。尋求:在MacOS和Linux上使用C#(單聲道)的用戶體驗

如果您使用C#在Windows上開發,則使用的是dot-Net。在Linux和MacOS上,您使用的是Mono。

其他人已經發布Mono非常好,不再是一個科學項目,並且大多數核心Microsoft功能都存在。但是這並沒有真正解決我的問題。我想知道:

  1. Mono對Linux/MacOS速率對Java的性能如何?如果我想在所有三個具有相同目標代碼的平臺上快速運行,我最好的選擇是什麼?
  2. 使用Mono與makefiles並使用emacs進行開發是否容易/可行/合理?
  3. 在MacOS和Linux中是否支持代碼因子分析?還是我只是咬牙切齒,在Windows中完成所有的開發工作?
  4. Mono和Subversion以及開源開發堆棧的其他部分一起工作有多好?怎麼樣autoconf?或者這是一種完全不同的做事方式?

感謝

+0

你說你應該可以在一個平臺上編譯並在任何地方運行。我對你的問題是你爲什麼這麼想。如果要編譯爲通用字節碼,如何充分利用64位處理和X86 externsions。另一方面,符合C/C++和像CMake這樣的體系構建系統的庫可以編譯爲受益於本機芯片優化。在硬幣的另一面,如果您想要真正的便攜性和易用性,而不用擔心獲得最佳性能,那麼您最好由Python提供服務。只是說。 – SpliFF 2011-02-14 04:19:51

+0

你需要什麼樣的速度?快速的桌面應用程序/快速多用戶3D遊戲?如果我想要快速和跨平臺的話,我會選擇C/C++ – Woody 2011-02-14 13:05:23

回答

10

我一直在使用單在Linux上大約三年,最近一直在使用它已經在OS X上一些Linux的東西是相當廣泛的,但OS X的東西剛剛被一些簡單的到目前爲止,ASP.NET MVC2應用程序。

1)Mono的性能對我來說從來都不是問題。這並不是說性能並不重要,只是Mono本身的性能從來就不是問題。我所做的很多事情都是基於Web的,所以I/O和數據庫內存的使用在Mono之前已經打到了我的面前。

歷史上,Mono最大的缺陷是垃圾收集器(GC)。我會說在這方面Java更好。 Mono的最新版本在這方面取得了巨大的進步,但在比較方面我沒有任何硬性數字。

我相信Mono有時會更快,而Java有時會更快,但我會說Java總體上更快。

2)您當然可以使用makefile進行Mono開發。 Mono團隊本身的確如此。你也可以使用Emacs,並且有一個C# mode for it

我傾向於自己使用MonoDevelop和xbuild(單一版本的msbuild),並且沒有任何在Emacs中完成C#工作的經驗。 MonoDevelop非常棒,因爲它在所有平臺上都完全一樣。另外,雖然我很少再使用它,但項目格式與Visual Studio和SharpDevelop相同很好。

3)MonoDevelop有相當不錯的代碼因子支持。在Windows,Linux和Mac上也是如此。您不需要使用Windows進行開發(儘管您當然可以),但我相信您會更喜歡使用像MonoDevelop這樣的IDE。即使像Intellisense這樣的東西,如果沒有習慣他們,就很難活下去。但集成調試,能夠深入到框架,數據庫集成,單元​​測試,SCM集成以及其他好的工具支持都在一個地方,只是要走的路(至少對我而言)。

4)Mono本身並不關心版本控制當然。你的源文件只是文本,你可以使用任何東西來管理它們。

也就是說,MonoDevelop具有夢幻般的支持Subversion的內置IDE。我已經廣泛使用它,這也是我即使在Windows上也無法移出MonoDevelop的原因之一。最新版本的MonoDevelop(2.6 beta)也包含Git支持。

你沒有提到單元測試,但MonoDevelop在IDE中內置了NUnit支持。我在每個項目中都使用它,並且它的工作非常出色。 MonoDevelop的版本是2.4.8(如果內存服務),所以它不是最新的,但它的效果很好。簡而言之,Mono一般適用於開源工具。它一直爲我打得非常好。

Autoconf當然是由Mono項目本身使用,但作爲一個Mono開發者,我從來沒有見過它的需要。我努力只在我的項目中使用託管代碼。因此,我需要的目標平臺是Mono(或.NET)。不必擔心所有這些是Mono或Java等託管環境的主要優點之一。運行時本身(CLR)確保我的應用程序具有正常運行所需的所有內容。

我知道MonoDevelop會爲C/C++項目(非單聲道)構建autoconf/autorun文件,但我自己並沒有做太多的工作。

至於以前的評論,Mono JIT顯然是針對目標平臺的。這是平臺特定的性能調整發生的地方。

就像一條評論一樣,我發現Mono最好被看作是一個開發環境,而不是Microsoft的兼容層。 Mono團隊以許多有趣的方式擴展了.NET。你爲Mono開發的任何東西都可以在.NET上運行,但是有一些.NET功能不適用於Mono。例如,Mono不支持Windows Presentation Foundation(WPF)。您必須使用Windows窗體或GTK#進行跨平臺GUI工作。您也可以在Mac上使用Cocoa#或MonoMac,iPhone上的MonoTouch或Android上的MonoDroid。你也可以使用Moonlight代替Silverlight,儘管我沒有玩過它。

自從您問到Java以來​​還有一件事。我發現有幾次Java世界有一些庫,我在.NET世界中找不到等價物。在這些情況下,我使用IKVM.NET將這個功能集成到了我的Mono應用程序中,獲得了驚人的運氣。 IKVM.NET也適用於.NET,但Mono和IKVM.NET非常舒適,甚至可以共享一些代碼。

所以你去了,至少有一個真正的答案。