.NET / Mono或Java是跨平台开发的更好选择吗?[关闭]


108

Mono的库比Java的库少多少?

我没有对这两种选择的概述,但是我对下一个项目有很大的选择自由。我正在寻找以下方面的硬技术事实

  • 性能(例如,我被告知Java很适合线程处理,而且听说最近.NET的运行时代码优化非常好)
  • 真实世界的可移植性(它们都是便携式的,每个Catch-22是什么?)
  • 工具可用性(CI,构建自动化,调试,IDE)

我特别是在寻找您在自己的工作中实际体验到的东西,而不是我能用Google搜索到的东西。我的应用程序将是一个后端服务,用于处理时间序列中的大量数据。

我的主要目标平台是Linux。

编辑: 为了更充分地表达我的问题,我对整个软件包(第三方库等)感兴趣,而不仅仅是语言。对于库,这大概可以归结为“ Mono比Java少多少个库”的问题?


仅供参考,此后,我选择Java进行该项目,因为在可移植性方面它似乎更加疲惫不堪,并且在较旧的系统上也存在了一段时间。我对此感到有点难过,因为我对C#很好奇,我很乐意在其中做一些大型项目,但也许是下一次。感谢所有的建议。


3
好问题。我们也在考虑对跨平台开发的评估。
Mat Nadrofsky

我会添加“哪个语言”标签,但是已经有5个,所以没有运气。
丹尼尔·达拉纳斯

在很大程度上取决于你的目标,其平台上的...
托尔比约恩Ravn的安徒生

1
现在可能是您看看golang的好时机……
StartupGuy 2015年

Xojo也可能值得考虑。它使用Windows和Mac Linux的LLVM编译本机应用程序。它具有IDE构建自动化,调试等功能。库具有许多功能,可以根据需要进行扩展。www / xojo.com
保罗·

Answers:


96

好吧……Java实际上更易于移植。Mono并非在所有地方都实现,它大大落后于Microsoft的实现。Java SDK似乎在各个平台之间保持更好的同步(并且可以在更多平台上使用)。

我还要说Java在所有这些平台上都有更多的工具可用性,尽管Windows平台上有很多可用于.NET的工具。

2014年更新

我在2014年仍然持这种观点。不过,我要说很久以后才开始关注Mono,因为我对此并不满意,因此Mono运行时(或生态系统)可能有所改进)我还没有意识到。AFAIK,仍然不支持WIF的WPF,WCF,WF。Mono可以在iOS上运行,但是据我所知,Java运行时仍比Mono运行在更多平台上。另外,Mono开始看到一些经过改进的工具(Xamarin),并且Microsoft似乎具有更加跨平台的态度,并且愿意与合作伙伴合作以使他们互为补充,而不是竞争(例如,Mono将成为是即将推出的OWIN / Helios ASP.NET格局的重要组成部分)。我怀疑在未来几年中便携性的差异会迅速减少,

2018年更新

我对此的看法正开始朝相反的方向发展。我认为.NET,尤其是.NET Core的广泛应用,已经开始通过Java实现“可移植性对等”。目前正在努力将WPF引入某些平台的.NET Core,并且.NET Core本身现在可以在许多平台上运行。Mono(由Xamarin拥有,现在由Microsoft拥有)是一种比以往更加成熟和完善的产品,并且编写可在多个平台上工作的应用程序不再是.NET黑客的深入诊断领域,而是一项相对简单的工作。当然,有一些库,服务和应用程序仅适用于Windows,或者只能针对特定平台-但Java(广泛地)也可以这样说。

如果我现在不做OP的话,那么我不会想到语言或技术堆栈本身固有的原因会阻止我为以后的任何应用程序选择.NET。


2
我真的很高兴读到这篇文章,并对Microsoft世界中的投票感到高兴。.NET确实很好,但是Java具有合法性,因为我一直试图解释为.NET开发人员和旧的Java开发人员;)
JoeBilly 2010年

为此+1。我发现Java的可移植性(对于非平凡的应用程序,即Web服务器,复杂的GUI,分析引擎)比其他任何方法都好。它不是很完美,但是它是您现在可以获得的最好的。
mikera 2012年

1
@Ben,您在2013年是否仍然持有此意见?如果这样做,您会介意提及吗,如果您不更新此答案?很多时候阅读4岁的答案很难说。
本杰明·格林鲍姆

1
@BenjaminGruenbaum是的,尽管我现在已经说了很长一段时间以来我对Mono的关注度不高,但我对此表示同意,所以可能在Mono运行时(或生态系统)方面有所改善意识到。AFAIK,仍然不支持WPF,WCF或WF。Mono可以在iOS上运行,但是据我所知,Java运行时仍比Mono运行在更多平台上。所以...是的 合格,但是可以。
Ben Collins

@HighCore的论点本身并不反对 Mono。这只是事实的陈述:如果您编写依赖WPF的代码,则无法使用Mono。因此,以这种方式是不可携带的。Java的UI框架可能很烂,但是据我所知,它们将在Java可以工作的任何地方工作(并且硬件支持这种UI)。但这并不能使Java 更好,而是使其以这种特定方式更具可移植性。
Ben Collins

112

Mono在定位我要支持的平台方面做得更好。除此之外,这都是主观的。

我在以下平台上共享C#代码:-iOS(iPhone / iPad)-安卓-Web(HTML5)-Mac(OS X)-Linux-Windows

我可以在更多地方分享它:-Windows Phone 7-Wii-XBox-PS3-等等。

最大的问题是iOS,因为MonoTouch可以出色地工作。我不知道使用Java定位iOS的任何好方法。您不能将Windows Phone 7与Java一起作为目标,因此我想说Java对移动技术更好的时代已经过去。

对我而言,最大的因素是个人生产力(和幸福感)。C#作为一种语言比Java IMHO领先多年,而.NET框架使用起来很令人愉悦。多年来,Java 7和Java 8中添加的大多数内容都已在C#中使用。不过,像Scala和Clojure这样的JVM语言(在CLR上都可用)非常好。

我将Mono视作一个平台(很好),并将.NET视为Microsoft在Windows上的Mono实现。这意味着我首先要在Mono上进行开发和测试。这很棒。

如果Java和.NET(比如说Mono)都是没有任何公司支持的开源项目,那么我每次都会选择Mono而不是Java。我相信这只是一个更好的平台。

.NET / Mono和JVM都是不错的选择,尽管我个人会在JVM上使用Java以外的其他语言。

我对其他一些评论表示赞同:

问题:性能。

**答案:JVM和CLR的性能都比批评者说的要好。我会说JVM性能更好。Mono通常比.NET慢(尽管并非总是如此)。

我个人将以开发人员和最终用户身份通过​​J2EE接受ASP.NET MVC。对Google Native Client的支持也很酷。另外,我知道台式Java应用程序的GUI性能差应该已经成为过去,但是我一直在寻找慢的应用程序。再说一次,我可以对WPF说同样的话。GTK#足够快,因此没有理由不必太慢。

问题:Java具有更大的可用库生态系统。

答:可能是正确的,但实际上这不是问题。

由于IKVM.NET,几乎每个Java库(包括JDK)都可以在.NET / Mono上运行。这是一项真正的奇迹。集成是惊人的。您可以像使用原生库一样使用Java库。我只需要在一个.NET应用程序中使用Java库。.NET / Mono生态系统通常提供超出我所需的功能。

问题:Java具有更好(更广泛)的工具支持

答:不在Windows上。否则我同意。MonoDevelop很好。

我要大声疾呼MonoDevelop;它是一颗宝石。MonoDevelop集成了我要使用的大多数工具,包括代码完成(智能),Git / Subversion集成,对单元测试的支持,SQL集成,调试,易于重构以及通过即时反编译进行的汇编浏览。对于从服务器端Web到移动应用程序的所有事物,都使用相同的环境真是太好了。

问题:跨平台的兼容性。

答:Mono是跨所有平台(包括Windows)的单个代码库。

首先为Mono开发,然后根据需要在Windows上部署到.NET。如果将MS的.NET与Java进行比较,则Java在跨平台的一致性方面具有优势。查看下一个答案...

问题:Mono落后于.NET。

答:不可以。恕我直言,这是一个经常陈述但不正确的陈述。

Xamarin的Mono发行版附带了C#,VB.NET,F#,IronPython,IronRuby,我想可能是Boo开箱即用。Mono C#编译器完全与MS保持同步。Mono VB.NET编译器确实落后于MS版本。其他编译器在这两个平台上都是相同的(与其他.NET语言(如Nemerle,Boo和Phalanger(PHP))相同)。

Mono附带了许多实际的Microsoft书面代码,包括动态语言运行时(DLR),托管扩展框架(MEF),F#和ASP.NET MVC。因为Razor不是开源的,所以Mono当前随MVC2一起提供,但是MVC3可以在Mono上正常工作。

核心Mono平台已与.NET保持同步或多年,并且兼容性令人印象深刻。您现在可以使用完整的C#4.0语言,甚至可以使用某些C#5.0功能。实际上,Mono通常以多种方式领导.NET。

Mono实现了甚至Microsoft都不支持的CLR规范的某些部分(例如64位数组)。Rosylyn是.NET世界中最激动人心的新技术之一。Mono已经将C#编译器作为服务提供了很多年。Rosylyn提供的一些产品也可以通过NRefractory获得。Mono仍然领先的一个例子是SIMD指令,以提高游戏性能。

微软确实在.NET之上提供了许多在Mono中不可用的产品,这是对Mono滞后的误解。Windows Presentation Foundation(WPF),实体框架(EF),WCF(Windows Communication Foundation)是在Mono上不起作用或支持不佳的产品的示例。显而易见的解决方案是使用跨平台替代方案,例如GTK#,NHibernate和ServiceStack。

问题:微软是邪恶的。

答:是的。所以呢。

许多人提供以下避免使用Mono的原因:

1)您不应使用Mono,因为应避免使用Microsoft技术

2)Mono很烂,因为它不能让您使用Microsoft提供的所有技术

对我来说,很明显这些语句是不兼容的。我拒绝第一条陈述,但在此将跳过该论点。第二个声明适用于所有.NET替代方案。

JVM是一个很棒的平台,并且JVM语言的爆炸性很棒。用什么让你快乐。就目前而言,对我来说通常是.NET / Mono。


3
感谢您在游戏后期提供如此广泛的答案。我从未使用过Mono / .Net / C#,但您的帖子似乎反映了该领域的一些最新发展。例如,我不记得MonoTouch在3.5年前那么重要。
Hanno Fietz

3
我对您的“ Mono不落后于.NET”的答案感到困惑。您声称,然后陈述了六种方法,实际上,它们落后于.NET(实体框架等)。可以肯定地说,它不会落后于Microsoft的C#编译器,但是.NET生态系统在Mono上充其量只是零碎的。出于您的目的,这似乎可以,但不是每个人都可以,因此这里有一个合理的问题。
samkass 2012年

1
@samkass:我想这里的重点是“滞后”和“未实现此库”之间的区别。在Java世界中,您会发现这类似于未实现Swing库的Android。还请注意,给出了跨平台(和开源,btw)的等效项。我每天都在使用Mono,而“充其量只是零碎”绝对不是我的经验。
konrad.kruczynski 2012年

9
缺少完整而强大的WCF和EF支持,并且对于我自.NET 3.0以来所做的几乎所有工作,WPF都不是Mono的杀手kill。是的,还有其他选择,但是.NET功能的很大一部分是这些附加框架。没有这些,我认为您根本无法调用与.NET兼容的Mono。充其量只是部分实现。我还使用了NHibernate,坦率地说,EF是一种更好的技术。从未使用过ServiceStack。IMO Mono具有很大的风险。
MrLane 2012年

1
错过WCF的每个人都应该看看服务栈。严重的是,不实施WCF是一件好事!
2013年

54

我实际上是用.NET开发的,首先在Mono上运行所有测试,然后在Windows上运行。这样我就知道我的应用程序是跨平台的。我在ASP.NET和Winforms应用程序上都做得非常成功。

我不确定从哪里得到人对Mono的印象如此恐怖,但是就我的观点和观点而言,Mono确实做到了。世界,但是到目前为止,Windows和Linux上的.NET 2.0对我来说还是非常可靠的。

请记住,显然有很多奇怪之处,但是其中大多数来自确保您正在编写可移植的代码。尽管这些框架在抽象化您正在运行的OS方面做得很出色,但是诸如Linux在路径和文件名中区分大小写之类的小事情和权限之类的事情却需要一点时间来适应。

根据我到目前为止的经验,.NET绝对是跨平台的,这要归功于Mono。


称我为无知,但您是否甚至需要使用mono测试ASP.NET?.NET的所有内容都是服务器端的,因此它显示在哪个OS上无关紧要?
伊桑·冈德森

9
Ethan,使用Mono,您可以在Linux上托管ASP.net应用程序。
埃里克·哈斯金斯

2
出于某种原因,并非所有人都希望在Windows上运行其应用程序。
伯纳德

2
@Rich B:如果客户不想要MS产品,.NET显然是错误的选择。
KjetilØdegaard,2009年

21
@Kjetil:Mono不是MS产品。
GEOCHET

26

Java实际上就像每个人所说的那样是跨平台的。几乎所有主流操作系统(最终甚至是Mac OS X)都有一个JVM实现,它们都运行良好。而且还有大量的跨平台开源工具。

唯一要注意的是,如果不编写某些DLL或SO,您将无法在Java中执行某些本机操作。这些在实践中很少出现。不过,在所有这些情况下,我都可以通过生成本机进程并筛选结果来解决它。


1
此外,在几乎每一个情况下的Java不能在跨平台的方式做一个本地操作,同样会是真实的.NET
伊莱Courtwright

最后?从10.0开始,Mac OS X就有了JVM实现。:)
mipadi 2010年

3
@Eli-可能是真的。当然,与.NET / Mono中的本机功能集成比与Java中的集成要容易得多。因此,如果您只是想与本机平台很好地集成,.NET / Mono会提供真正的优势。
贾斯汀

“催生本机进程并筛选结果”
基本

我会质疑“几乎所有主流操作系统”,因为对于Android或iOS而言,没有开箱即用的JVM。同时,借助.NET中新的可移植类库,您实际上可以跨平台(包括移动平台)共享编译后的代码(尽管实际上不是UI代码)。
Mathieson 2014年

18

我认为这个问题的措词不正确。就跨平台使用而言,C#与Java相比,(a)您需要支持哪些平台,以及(b)考虑核心库和可用的第三方库,有趣得多。语言几乎是决策过程中最不重要的部分。


同意 这取决于虚拟机在各种体系结构上的支持程度。
Allain Lalonde

同意 如果客户无法运行完整的开发,那将毫无乐趣。
托尔比约恩Ravn的安徒生

15

Java是跨平台开发的更好选择。

  • 性能。由于虚拟机的存在,Java和.Net的性能水平相似,但是由于经过多年的优化,JVM通常具有更好的性能。

  • 图书馆。尽管这取决于您的任务,但是Java那里有更多可用的开源或第三方库。对于服务器App,J2EE,Spring,Struts等。对于GUI,尽管.Net提供了Win32层API,但这会导致兼容性问题。Java具有Swing,SWT,AWT等。在大多数情况下,它都可以工作。

  • 兼容性。这是开发跨平台程序时需要考虑的关键问题。两个问题:第一,平台兼容性。由于JDK由单一原始公司Sun维护良好,因此Java仍然是赢家。MS不维护Mono,因此您不能保证更新兼容性。2.向后兼容。Sun在其向后兼容性方面一直保持良好声誉,尽管有时这似乎过于僵化并减慢了步伐。

  • 工具。Java具有良好的跨平台IDE。Netbeans,Eclipse等。其中大多数是免费的。VS Studio很好,但仅在Windows上才花一点钱。它们都提供良好的单元测试,调试,配置文件等。

因此,我建议Java是更好的选择。作为一个示例,有一些Java开发的著名的桌面跨平台应用程序:Vuze,Limewire,BlogBridge,CrossFTP,更不用说那些IDE了。至于.Net,我对此类成功应用程序的了解有限。


在“其他” Linux上使用mono变得棘手。这反映了Mono的主要问题:Mono的未来过于依赖Miguel de Icaza的独裁统治。案例分析:对“其他...(不支持)”的支持减少[ mono-project.com/Other_Downloads] Linux似乎与Miguel de Icaza对Linux的幻灭感相关(IMHO)(tirania.org/blog/archive/ 2013 / Mar-05.html)。Java不会遭受这个独裁问题。C#可以在更多平台上运行,但这会带来更多的成本,风险,妥协和对de Icaza先生的依赖。不用了,谢谢。
2013年

@ Michael.M,所以您宁愿选择Oracle的心血来潮?
托尔比约恩Ravn的安德森

@ThorbjørnRavnAndersen:错了。让我尽可能简单地分解它:.Net- > MSFT 平台(稳定的成功公司;有限但整洁的生态系统); - >德伊卡萨框架(EL dictador;不热的Linux和它表明:cultofmac.com/218632/... -尝试在CentOS 6.4安装单,这是一个“不支持”的噩梦); 的Java是一个规范属于社区,有许多不同的供应商的实现(Oracle是只有一个)[ coderanch.com/t/327542/java/java/...
StartupGuy

@ThorbjørnRavnAndersen:..此外,Java的主要赞助商甚至可以将Oracle排除在外,而且仍然可以成功并得到非常好的支持-Java绝不是Oracle的一时兴起 ---请访问:news.techworld.com/applications/3252787/ … Oracle可以放弃他们所有的Java参与,并且仍然可以继续使用。还有哪些其他供应商提供.Net平台?除Xamarin之外,还有谁提供Mono运行时?Java是其中唯一不受独裁的一种,并具有真正的社区控制,社区支持和社区管理。
StartupGuy

1
@ Michael.M规格?属于社区?我认为您错了-我也相信,收购Sun后没有关闭OpenJDK项目的唯一原因是GPL。Java处于Oracle的铁腕中,仅仅是因为TCK不能免费获得,而这正是使JVM表现得像Oracle JVM所需要的。我对Mono或De Icaza没问题,但是我认为Java情况不会好得多。IBM停止支持时,唯一具有动力的替代JVM项目就死了。
托尔比约恩Ravn的安德森


8

我还要说Java。如果从成熟度的角度来看,Sun(和其他公司)已经花费了更多的时间和精力来使JVM在非Windows平台上运行。

相反,Mono绝对是.NET生态系统中的二等公民。

根据您的目标客户是谁,您可能还会发现反对使用Mono的真正障碍– Novell是否提供与Windows上的Java或.NET相同的Mono支持?

如果您的主要目标是在Windows上托管服务,那么考虑选择此选项将很有意义,但是由于您的主要目标是Linux,所以对我来说似乎很容易。


我倾向于同意莫诺是二等公民,但不同意结论。Java已经存在了很长时间,并且充满了遗留的古怪之处和内存管理问题,更不用说Java总是选择最冗长的方式来做某事。多年来,它(语言)也一直停滞不前,直到最近才开始合并多年来在.Net中使用的功能。恕我直言,这是在两种弊端之间进行选择... Flakey平台支持w.Net或笨拙的庞然大物,演化缓慢且繁琐的代码编写。
基本

7

Java被设计为跨平台的。C#/。Net不是。如有疑问,请使用为您目的而设计的工具。

编辑:公平地说,.NET设计为可在嵌入式/ PC /服务器环境中工作,因此这是跨平台的SORT。但是它不是为Linux设计的。


3
好吧,C#是ISO标准化的,所以这个想法是要跨平台的。微软不想为其他平台开发实现,但由于该语言是一种标准,因此留给了其他各方。.Net框架是一个更复杂的故事。
zappan

Mono是一个很好的实现,而DotGNU(也适用于Mac)
AndreiRînea,

1
zappan:C#上的有效点(未知),但是.NET异常庞大。诚然,我没有个人经验。
AlexeyMK

@zappan-从实际角度看,C#是标准化的(或者Mono可以很好地克隆C#)是无关紧要的。平台可移植性涉及整个平台(包括库和工具生态系统),而不仅仅是语言本身。从这个意义上说,.Net绝对不是完全跨平台的。
mikera

7

我认为答案是“取决于情况”。Java几乎可以在任何东西上运行,但是.NET / Mono(IMHO)是更好的桌面框架。因此,我想答案实际上取决于您计划针对的平台。


即使桌面具有最大的桌面空间,它也不是Windows的同义词。
ZOXIS

6

为了使对话更加有趣,如果您只落后一个版本,那么Java将具有更高的可移植性-Java 5仍然具有许多出色的功能,因此您可以等待Java 6并在语言和库开发方面有很多选择用。Mac是主要平台,可能需要一些时间才能赶上最新的Java版本。

Java还有一个出色的标准机构,可以根据许多不同公司的输入来智能地扩展平台。这是一个经常被忽略的功能,但是它甚至可以使新功能在多个平台上正常运行,并且为某些深奥的事物(作为可选扩展)提供了很多的库支持。


OS X 10.6现在已经完全赶上了Sun Java 6发行版。
托尔比约恩Ravn的安徒生

5

我赞成Java比C#具有更高的可移植性。Java肯定也有一组非常丰富的标准库。那里还有各种各样的开源第三方库,例如Jakarta项目(http://jakarta.apache.org/)提供的库。

所有常见的可疑对象也都存在CI,单元测试等。跨平台IDE支持也非常好,例如Eclipse,Netbeans,IntelliJ IDEA等。


4

还有其他语言选择。我已经非常喜欢Python,它可以在Windows,Linux和Mac上很好地工作,并且具有丰富的库。


是的,我喜欢Python,并且它具有Django,我喜欢将其用于Web应用程序,但是有一些使它无法接受的事情,最重要的是解释器的标准C实现中的GIL。我有许多操作可以从多核计算机上的并行计算中受益匪浅,而且我必须生成进程才能在cPython中做到这一点。
汉诺·菲茨

3

尽管Mono存在很多问题,但我认为它具有更好的跨平台兼容性,尤其是在您依赖于本机平台调用的情况下。

在Stack Overflow上没有足够的词汇来强调在多个平台上进行.NET / Mono中本机调用和执行(至少以我的经验3 ...)与在同等Java工作量上相比,执行本机要平滑得多。


我同意,只要可以从C调用.NET / Mono来调用平台特定的代码,就非常容易。使用CXXI(发音为sexy),调用C ++代码也变得很容易。tirania.org/blog/archive/2011/Dec-19.html
贾斯汀

2

Gatorhall您是否有一些数据可以备份?

性能。由于虚拟机的存在,Java和.Net的性能水平相似,但是由于经过多年的优化,JVM通常具有更好的性能。

背景:我是Windows 3.1以后的Windows用户,目前是Linux用户(仍在运行Visual Studio 2010和其他工具的VM上运行Windows 7,出色的OS)。

关键是:我和我认识的许多用户(Windows,Linux等)可能与您不同意。即使在Linux桌面应用程序上,Java的执行速度往往也会变慢,而ASP.NET在Java服务器页面上的执行速度通常要快很多。有些人可能同意,即使在几种情况下,即使未编译的PHP也会表现更好。

Java更跨平台吗?我对此毫无疑问(历史可以追溯到此),但是速度较快(不是说.NET是不确定的),我希望看到一些真正的基准。


还有另一个问题可能会有所帮助,当然还有语言大战。JVM可能已进行了更优化,但已关闭(尤其是在Windows上)。ASP.NET与J2EE或JSP的基准测试更加令人怀疑,但我毫不怀疑,即使运行时紧密,ASP.NET的速度也要快得多。
贾斯汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.