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

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

Is .NET/Mono or Java the better choice for cross-platform development?

Mono的库比Java的库少多少?

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

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

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

我的主要目标平台是Linux。

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

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


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

好。

我在以下平台上共享C#代码:
-iOS(iPhone / iPad)
-安卓
-网络(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。

好。

好。


好吧……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格局的重要组成部分)。我怀疑在未来几年中,可移植性的差异会迅速缩小,尤其是在.NET开放源代码之后。

2018年更新

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

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


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

我不确定从哪里得到Mono的印象是如此恐怖,但就我的观点和观点而言,Mono确实做到了这一点。确实,.NET的最新,最伟大的发明会有些滞后世界,但是到目前为止,Windows和Linux上的.NET 2.0对我来说还是非常可靠的。

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

根据迄今为止的经验,由于Mono,.NET绝对是一个非常跨平台的平台。


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

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


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


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,我对此类成功应用程序的了解有限。


我一直在问同样的问题,恕我直言,.NET / Mono似乎是一个更好的选择,这仅仅是因为Mono在跨平台桌面应用程序(与Java相对)方面拥有良好的记录,当然,Mono是这些天来不断进步。


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

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

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

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


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


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

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


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

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


我赞成Java比C#更可移植。 Java肯定也有一组非常丰富的标准库。还有大量开放源代码的第三方库,例如Jakarta项目(http://jakarta.apache.org/)提供的库。

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


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


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

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


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

Performance. Java and .Net have similar performance level due to the virtual machine, but JVM normally has better performance because of years and years optimization.

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

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

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


推荐阅读