在此时,您将为.NET和Java之间的项目选择什么?我说我会考虑“您将始终部署到Windows吗?”在一个新的Web项目中占据先机的最重要的技术决定,如果答案为“否”,我建议使用Java而不是.NET。

一个非常普遍的反驳是“如果我们要在Linux / OS X /上运行,无论如何,我们都将运行Mono” 1,这从表面上来说是一个非常引人注目的论点,但是出于几个原因,我并不同意。


OpenJDK和所有供应商提供的JVM已通过官方的Sun TCK,以确保一切正常。我不知道Mono通过Microsoft TCK。
Mono落后于.NET版本。当前完全支持什么.NET级别?
所有GUI元素(WinForms?)在Mono中都能正常工作吗?
企业可能不希望将开源框架作为官方计划B来依赖。 >
我知道,随着Oracle对Java的新管理,未来是不安全的,但是例如IBM为包括Linux在内的许多平台提供了JDK。它们只是不是开源的。

那么,在什么情况下Mono是.NET应用程序的有效业务策略?


1Mark H总结为: “如果声称“我有一个用.NET编写的Windows应用程序,则应在mono上运行”,则不是这样,这不是有效的主张-但Mono努力使这种应用程序的移植更加简单。”

评论

另请参阅developers.stackexchange.com/questions/20023/…

需要明确的是,.NET是Microsoft对CLI的实现。 Mono是一个由Novell领导的CLI实现。

这听起来更像是对前一个问题的答案,而不是本身的问题。我建议您考虑编辑您的问题以使其独立存在。

@walter,整个观点是,我知道通常的“ java比.NET更具跨平台”参数,并且列出它们是为了使答案包含最佳的反参数。

这是该问题的题外话。前往业务计划站点并浏览一些示例计划,以了解对业务真正重要的是什么... Tech X vs Tech Y与FedEx辩论福特与GM的送货车一样重要。

#1 楼

Sparkie的答案得到了,让我补充一下。

“ .NET是跨平台的”声明过于模棱两可,因为其最初创建的框架和世界都在发生变化和发展。

简短的答案是:

支持.NET及其派生语言的基础引擎公共语言基础结构标准是跨平台的,就好像您要制作自己的。代码转到多个平台,您需要计划在正确的平台上使用正确的API,以在每个平台上提供最佳体验。

CLI家族尚未尝试“一次编写,可在任何地方运行”方法,因为从手机到大型机的差异太大。取而代之的是,出现了针对特定平台的API和运行时功能,为开发人员提供了在每个平台上创建出色体验的正确工具。

考虑一下:程序员不再以Windows PC或Unix Server为目标。从PC到游戏机,功能强大的电话,机顶盒,大型服务器和分布式机器集群,如今,当今世界比以往任何时候都更加吸引人。一种适用于所有平台的大小文件只会在微型设备上感到肿,而在大型系统上却感觉功能不足。

Microsoft的.NET Framework产品不是跨平台的,它只能在Windows上运行。 Microsoft的.NET Framework有所不同,它们可以在其他系统(例如Windows Phone 7,XBox360和通过Silverlight的浏览器)上运行,但是它们的配置文件都略有不同。

今天,您可以使用基于.NET的技术来针对所有主流主流操作系统,电话,移动设备,嵌入式系统和服务器。以下列表显示了在每种情况下都将使用哪种CLI实现(此列表并不全面,但应涵盖99%的情况):


基于x86和x86-64 PC电脑:


运行Windows->通常运行.NET或Silverlight,但也可以在此处使用完整的Mono。
运行Linux,BSD或Solaris->您运行完整的Mono或Silverlight
运行MacOS X->您运行完整Mono或Silverlight
运行Android->您运行Mono / Android子集


ARM计算机:


运行Windows Phone 7:您运行Compact Framework 2010
运行Windows 6.5及更早版本:运行旧的Compact Framework
Android设备:运行Mono / Android


PowerPC计算机:


在完整的Linux,BSD或Unix操作系统上运行完整的Mono
在PS3,Wii或其他嵌入式系统上运行嵌入式Mono。
在XBox360上,运行CompactFramework


S390,S390x,Itanium,SPARC计算机:


您运行完整的Mono



其他嵌入式操作系统:


您可以通过移动配置文件运行.NET MicroFramework或Mono。



根据您的需要,上面可能是否足够。您几乎不会获得相同的源代码可以在任何地方运行。例如,XNA代码不会在每个桌面上运行,而.NET Desktop软件不会在XNA或手机上运行。通常,您需要对代码进行更改以在.NET Framework的其他配置文件中运行。以下是一些我知道的配置文件:


.NET 4.0配置文件
Silverlight配置文件
Windows Phone 7配置文件
XBox360配置文件
Mono核心配置文件-遵循.NET配置文件,可在Linux,MacOS X,Solaris,Windows和BSD上使用。
.NET Micro Framework
iPhone配置文件上的Mono
Android配置文件上的Mono
PS3配置文件上的Mono
Wii配置文件上的Mono
Moonlight配置文件(与Silverlight兼容)
Moonlight扩展配置文件(Silverlight +完整的.NET 4 API访问权限)

因此,每个配置文件实际上都稍有不同,这不是一件坏事。每个配置文件旨在适合其宿主平台,并公开有意义的API,并删除不合理的API。例如,Silverlight用于控制宿主浏览器的API并不合理。在通电话。 XNA中的着色器在缺少对它的同等支持的PC硬件上毫无意义。

您越早意识到.NET并不是将开发人员与硬件和硬件的基础功能隔离开的解决方案。

首先,有些API和堆栈可在多个平台上使用,例如ASP.NET可以在Windows,Linux,Solaris,之所以使用MacOS X,是因为.NET和Mono上都存在这些API。 ASP.NET在Microsoft某些受支持的平台(如XBox或Windows Phone 7)上不可用,并且在Mono支持的其他平台(如Wii或iPhone)上也不受支持。

以下信息仅是正确的截至11月21日,Mono世界中的许多事情都可能会发生变化。

相同的原理可以应用于其他堆栈,完整的列表将需要一个适当的表,我不知道该如何做此处介绍,但此处列出了特定平台上可能不提供的技术。您可以假设这里没有列出任何可用的东西(随时可以将我错过的内容发送给我):

Core Runtime Engine [无处不在]


Reflection .Emit支持[除WP7,CF,Xbox,MonoTouch,PS3之外的所有地方]
CPU SIMD支持[Linux,BSD,Solaris,MacOS X;很快,PS3,MonoTouch和MonoDroid]
继续-Mono.Tasklets [Linux,BSD,Solaris,MacOS,PS3,Wii]
程序集卸载[仅Windows]
VM注入[Linux,BSD, MacOS X,Solaris]
DLR [Windows,Linux,MacOS X,Solaris,MonoDroid]
泛型[PS3和iPhone上的某些限制]。

语言


C#4 [无处不在]
C#编译器即服务(Linux,MacOS,Solaris,BSD,Android)
IronRuby [无处不在,执行WP7,CF ,Xbox,MonoTouch,PS3]
F#[任何地方,execpt WP7,CF,Xbox,MonoTouch,PS3]

服务器堆栈


ASP.NET [Windows,Linux,MacOS,BSD,Solaris]
ADO.NET [无处不在]
LINQ to SQL [无处不在]
实体框架[无处不在]
核心XML堆栈[无处不在]


XML序列化[除WP7,CF,Xbox之外的所有地方]


LINQ to XML(无处不在)
System.Json [Silverlight,Linux,MacOS,MonoTouch,MonoDroid]
System.Messaging [Windows;在Linux,MacOS和Solaris上需要RabbitMQ]。
.NET 1企业服务[仅Windows]
WCF [在Windows上完整;请在Windows上使用。 Silverlight,Solaris,MacOS,Linux,MonoTouch,MonoDroid上的一小部分]
Windows Workflow [仅Windows]
卡空间标识[仅Windows]

GUI堆栈


Silverlight(Windows,Mac,Linux-带Moonlight)
WPF(仅Windows)
Gtk#(Windows,Mac,Linux,BSD)
Windows.Forms( Windows,Mac,Linux,BSD)
MonoMac-本机Mac集成(仅Mac)
MonoTouch-本机iPhone集成(仅iPhone / iPad)
MonoDroid-本机Android集成(仅Android)
Media Center API-仅限Windows
Clutter(Windows和Linux)

图形库


GDI +(Windows,Linux,BSD,MacOS )
石英(MacOS X,iPhone,iPad)
Cairo(Windows,Linux,BSD,MacOS,iPhone,iPad,MacOS X,PS3,Wii)

Mono库- Cross Platform,可以在.NET中使用,但需要手动构建


C#4编译器即服务
Cecil-CIL操作,工作流,CIL的工具,链接器
放松库
Mono.Data。*数据库提供程序
完整的System.Xaml(用于在.NET不提供堆栈的设置中使用)

MonoTouch表示Mono在iPhone上运行; MonoDroid表示Mono在Android上运行; PS3和Wii端口仅适用于Sony和Nintendo合格的开发人员。

由于缺乏正式性,我深表歉意。

评论


IBM,如果您读过这篇文章,我希望AIX(甚至AS / 400)能出现在Miguels名单上!!

–user1249
2010-11-22 7:59

感谢您提供明确,权威的答案(sp?)!

–user1249
10 Nov 22'8:02

我们知道IBM已经完成了至少两个将Mono移植到AIX的移植,但是不允许移植该移植的团队撤消所做的更改。

–miguel.de.icaza
10 Nov 23'1:24

+1-这个人应该在Mono项目上工作!请不要上诱饵;)

– JeffO
2012年1月4日在16:12

@JeffO:这个家伙是Mono的创造者;-)

–首尔
13年3月22日在14:32

#2 楼

首先,您需要区分公共语言基础结构(开放标准)和.NET(Microsoft对该标准的实现)。 Mono是CLI的一种实现,从未宣称是“便携式.NET”。另外,C#语言是一种开放标准,并不严格地与.NET绑定。

我不知道Microsoft是否有任何工具可以验证实现是否兼容,但是如果这样做,我很确定单声道家伙拥有它并使用它。

Mono落后于.Net,但几乎没有。 Mono可以运行C#4.0代码(当前.NET版本)。另外,微软最近已将所有DLR代码和库开源(根据Apache 2.0许可),这使mono能够利用IronPython,IronRuby和F#等语言在上周才被开源。此外,Microsoft定期发布.NET中即将发布功能的CTP,这使Mono开发人员可以了解最新发行版本。

.NET中有许多工具和扩展,例如,代码合同。这些并不总是完全在mono中实现。 (目前,我认为有一个用于需要合同的部分合同验证器)。无论如何,它们都不是.NET应用程序中常用的方法,但是如果它们的普及度增加,它们在mono中实现的速度也会提高。

WinForms不能(完全)可移植。它们是.NET特有的,不是CLI的一部分。 CLI没有指定任何特定的窗口小部件集。尽管有跨平台的小部件集(GTK#和Silverlight)。如果您从头开始编写应用程序时考虑到可移植性,则可以使用其中一种而不是Winforms / WPF。此外,mono为Winforms API提供了一个薄包装器-使现有的winforms应用程序可以更轻松地移植到GTK#中(无需整个重写)。

Mono提供了一个Mono迁移分析器(MoMA)工具,该工具可以使用现有的.Net应用程序并告诉您它的可移植性。 (例如,标识使用的不可移植库,P / Invokes等)。

对于不想依赖开源的企业-可以重新许可mono。添加到mono的代码的所有权已移交给Novell,Novell可以使用普通LGPL许可(反过来几乎没有限制)以外的其他方式来许可它。

因此,“。NET是可移植的”,如果您是从头开始编写代码并且知道该框架的可移植性问题,那么我认为这可能是一个有效的断言。如果声称“我有一个用.NET编写的Windows应用程序,则应在Mono上运行”,则不是这样,这不是有效的主张-但Mono努力使此类应用程序的移植更加简单。

评论


+1为最后一段。

– Davy8
2010-11-20 19:36

C#语言是一种开放标准,并不严格地与.NET绑定。与C#4.0代码(当前的.NET版本)矛盾

–贾德·迪亚斯(Jader Dias)
2010-11-20 23:11

您的最后一点是一个不错的观点,同样适用于Java。仅仅因为您用Java编写了应用程序并不意味着它可以自动移植到支持Java的每个平台上。特别是对于更复杂的项目,您会发现许多Java应用程序都具有特定于平台的代码。

–迪恩·哈丁(Dean Harding)
2010-11-21 5:29

@ user8057:Winforms是否已100%实现?认真吗签出RichTextBox组件。在Tree组件上检查拖放功能。另一方面,Swing是100%跨平台的,尽管这可能意味着在所有平台上都难以承受。

–丹·罗森斯塔克(Dan Rosenstark)
2010年11月21日在21:53

@Yar:大声笑“虽然可能意味着在所有平台上都难以理解” :-)

–Wizard79
10 Nov 22'9:35

#3 楼

点对点:




OpenJDK和所有供应商提供的JVM已通过官方的Sun TCK,以确保一切正常。我不知道Mono通过Microsoft TCK。
Microsoft CLR符合一个规范。 Mono不是Microsoft CLR的克隆,而是该相同规范的实现。一方面,这有可能导致更大的不兼容性。实际上,这对于mono来说效果很好。

Mono跟踪.NET版本。当前完全支持什么.NET级别?
由于.Net文档在实际发行版之前,因此mono在Microsoft正式发行之前实际上已经完成了对.Net 4的支持(不是beta版)。此外,mono在记录不支持的内容方面做得非常好,它们具有一些可在现有项目上运行的工具,可帮助您发现可能存在不兼容的地方。

是否所有GUI都可以元素(WinForms?)在Mono中能正常工作吗?
绝大多数winforms都可以正常工作。 WPF,不是很多。我听说Java也是这样-许多高级小部件/ gui工具包并非在所有平台上都得到很好的支持。

企业可能不希望依赖于开源框架,因为官方计划B。
如果是这样的话,那么他们肯定不会使用Java,因为这样会使计划A的开源框架更高。

总而言之,如果您现在想构建一个跨平台的应用程序,那么从一开始就从mono开始并将其用作您的框架没有任何问题。如果需要,您甚至可以在Windows上部署mono。

另一方面,如果您打算今天构建Windows应用程序,并且认为将来可能需要跨平台,则可能要使用本机Windows小部件和工具。 .Net在这里比Java做得更好,在这种情况下,单声道是完全可以接受的回退。

:是的。你的问题。不,mono不仅会开箱即用地运行每个.Net程序,但是您的问题是在一个新项目的上下文中。使新项目摆脱困境并避免兼容性问题并不需要太多工作,特别是如果您考虑针对Mono开发而不是针对.Net进行开发。

大多数情况下,我认为这首先是错误的问题。除非您是从头开始建立新的开发团队,否则您将从具有某个领域或另一个领域专业知识的程序员开始。通过与您的程序员已经知道的知识相结合,可以实现最佳结果。与构建跨平台应用程序似乎很重要,如果您的团队中充满了Java经验很少的.Net程序员,那么您就不可能解雇他们或让他们都为下一个项目学习Java。如果您有一个由Java程序员组成的团队,那么您就不会要求他们为仅Windows项目学习.Net。这些都不是疯子。

评论


只是为了澄清“开放源代码”问题:我在想一个开放源代码项目是不受可支持的业务实体支持的,而不是具有GPL源代码的业务。

–user1249
2010年11月21日在10:33

Novell不是“合适的企业实体”吗?

– svick
2010-11-21 13:53

@svick-我认为“合适的”不是错字。他担心与项目支持者有关的法律问题。

–乔尔·科恩(Joel Coehoorn)
2010-11-21在19:20

@Thorbj从业务角度来看,拥有像Novell这样的强大支持实体比像JCP这样的抽象实体更好。

–乔尔·科恩(Joel Coehoorn)
2010年11月21日在19:21

@ user8057啊,我从来没有听过这个词。看起来像是一个奇怪的错字。

– svick
2010年11月21日,19:25

#4 楼

我曾经与Mono合作过,我想说它与开源的,Microsoft不直接支持的替代平台一样好。如果您可以轻松使用Clojure或Scala等其他开源平台,则可以使用Mono。

Mono支持的.NET级别始终可以在Mono路线图中找到页。

所有GUI元素都能正常工作吗?据我所知,它们确实可以,尽管我还没有穷尽每一个要素。

Mono是否与.NET相同?否。我怀疑这里和那里都需要进行细微(也许是主要)调整。例如,您目前无法与其一起运行实体框架。

评论


当然,Mono并不是一个精确的克隆,但据我所知,在开始新项目时,Mono是一个非常可行的选择。

–混沌潘迪翁
2010-11-20 17:51

您的人物是美美me3i吗?来自美国?

–贾德·迪亚斯(Jader Dias)
2010-11-21在1:14



@Jader,完全没有关系-但这是美丽和美国的汉字(当组合表示美国时,从字面上也意味着美丽的国家)

–aggietech
2011年9月19日在16:22

AFAIK Clojure和Scala是语言而非平台。而且(同样是AFAIK),Scala应该在可以运行Java的任何JVM实现上运行。

–乔治
2012年9月7日18:33

#5 楼

作为目标,.NET / mono宇宙的发展非常迅速。

每隔几年,Microsoft就围绕.NET的语言,运行时和基础结构进行一些引人注目的更改和创新。例如:泛型,LINQ,DLR,实体框架-随着Visual Studio的每个新修订版,它所针对的框架的功能集和实用性通常都会有相当大的提高。

常量欢迎对该框架进行改进,如果您希望跨多个平台兼容,那么这也是个问题。红帽企业Linux之类的长期支持平台在采用新技术方面进展缓慢,并且在任何给定的时间点,Mono平台都将在最近几个月内发生重大改进。因此,如果您想运行酷孩子们正在建设的东西,则必须从头开始编译Mono并管理自己的补丁程序和更新。那太酷了。

另一方面,Java就像一个小孩池一样停滞不前。尤其是现在,它由一家只希望用Java来解决专利诉讼的公司所拥有,您可以肯定地说,在可预见的将来,语言或运行时将不会发生可检测的变化。 Java与FORTRAN一样稳定。如果您希望进行任何改进,那不是很好,但是如果您尝试部署企业应用程序,那不是那么糟糕。

评论


有趣的是,您提到了Fortran,因为它一直在不断发展,强调并发性和并行性以及OOP原则。所以是的,Fortran 77是稳定的,但是自从Fortran 90发布以来,每个修订版本都越来越好。 Fortran 2008是“几乎”一种现代语言。

– John Alexiou
10-11-21在7:28

我想说的是.Net / C#1.0充其量只是一个糟糕的Java克隆,但是到.Net 2.0为止,这两个平台之间的功能相当不错。从那里到.Net 3.5 / C#3,Microsoft的平台在大多数方面都将Java甩在了后面,并且它在动态输入等新功能以及异步并发等新功能方面不断发展。就是说,.Net之所以能够如此快速地移动的一个主要原因是Java留下的痕迹。如果甲骨文希望推动Java向前发展,他们将能够迅速遵循微软现在留下的类似路线。

–乔尔·科恩(Joel Coehoorn)
2010年11月21日19:25



“ .NET / mono宇宙运行非常快”。具有讽刺意味的是,我们不使用Mono的主要原因是它的GC开发速度非常慢。他们将当前稳定的GC描述为2003年的“临时措施”! listing.ximian.com/pipermail/mono-gc-list/2003-August/000012.html

– J D
2011年1月5日19:48

或者,您可以运行Debian / Ubuntu,使用一些外部apt仓库,并与很酷的孩子一起玩,而无需从头开始编译mono。

–四进制
2013年9月9日在8:21



#6 楼

从用户的角度来看,Mono致力于使Windows .NET应用程序与Linux兼容。如果您实际上尝试在Mono中运行任何编写得体的Windows应用程序,它将无法正常工作。

从打包程序的角度(我以前在PortableApps上做过一些工作),. NET既可以祝福和诅咒。如果您仅在Windows上使用.NET,则部署会更加容易,因为更多的库意味着更少的系统相关内容(我相信,尤其是在Windows版本之间),但是即使在Windows上,也同样会造成极大的混乱,因为.NET版本都不会倒退-compatible或转发兼容。您必须为不同的程序下载不同版本的.NET。

也就是说,Mono是使C#程序跨平台的一个很好的起点。只是不要将程序与最新的WINE打包在一起就可以了。看看Picasa的去向。

与两种语言/平台的政治稳定一样,RMS可能会开始抱怨Novell领导Mono的方式,Novell与Microsoft的蜜月期是众所周知的。这两个平台现在都可以认为在政治上是不稳定的。

如果您真的想要简单的跨平台,那么经过实践检验的真正途径就是QT,从目前的角度来看,它在政治上是相当稳定的,这是a)LGPL,b)过去几年的主要许可问题和c)由诺基亚支持,诺基亚销售真正流行的手机。

评论


事情变多快。诺基亚不再销售人们想要的手机,而且Novell不再存在,而Qt和Mono的未来都令人怀疑。这可能就是为什么企业不喜欢使用诸如Microsoft之类的“主要支持”系统以外的其他原因的原因。这就是为什么开源是一个好主意的原因。

– gbjbaanb
2011年5月10日上午10:27

#7 楼

Mono不是Microsoft .net的1:1端口。有Mono根本不会实现或没有计划这样做的技术(例如Workflow Foundation或WPF),而另一方面,它们拥有Microsoft .NET却没有的某些自身技术,例如SIMD Extensions 。

简短的回答:Mono和Microsoft .NET基于相同的基础基础-CIL和BCL-但是单独的项目。

#8 楼

对原始帖子中的声明进行小评论。我会争辩说,TCK仍然是理论工具,允许Oracle宣称Java是开放标准。因为如果您注意到了,Apache Harmony几年来一直试图获得“ Java”认证,但未成功。显然,除了与他们相关的开源控制或多或少的控制(OpenJDK)之外,Oracle确实对开放源代码实施不感兴趣。很像Mono,它并不完整(即不支持Java Web Start),并且缺少封闭源HotSpot实现中可用的一些优化。

可以这么说,自2010年起; (大多数)Java是开放源代码,但不是开放标准,而(大多数).NET不是开放源代码,而是开放标准。当然也有例外,DLR,IronPython,IronRuby和F#实际上是开源的。 Mono很有趣,因为它提供了两全其美的开放标准的开源实现。

评论


Java的开放性本身并不是重要的部分。根据我的经验,我的程序在通过TCK的JVM上运行良好,因此这是一个重要的参数。

–user1249
2011-09-19 14:16

#9 楼

撇开所有技术因素,在实际编写代码时会发生非常重要的事情。

与任何跨平台技术(例如Java,Python,Ruby ...)一样,如果代码不是考虑到可移植性,您应该假定代码正常运行的机会基本上为零(即使实际上这种机会要高得多),因为奇怪的举止可能非常关键。阅读:不要获取随机程序集并在Mono下运行它。

但是对于一个新项目(或者您可以轻松重构的项目),选择.Net / Mono作为可能的可移植运行时是有意义的,但是,即使项目在使用多平台方面仅有很小的变化,也可以通过尽早在Mono上测试代码来节省很多麻烦。如果使用连续集成服务器,则可以像设置Mono构建节点一样简单。只需养成一个习惯就可以解决许多问题(例如构建路径字符串),并且只需使用理智的做法和一些预见性,就可以在Mono上移植并进行大量的代码测试。其余部分(即单元测试失败)则是特定于平台的(例如使用PInvoke的代码),但应进行充分封装,以便能够为每个目标平台提供替代实现。这样,当最终移植项目时,大部分工作几乎是免费完成的,其余部分将在及时开发。

当然,使用的库不可用(.Net)或兼容(第三方)中的任何内容都不能排除,但在我的领域中尚未看到。那是我们在工作中实际使用的策略,在应用它时,我不用担心声称.Net + Mono是跨平台的。

#10 楼

诚实的答案是多种多样的。我已经看到小型Web服务器从IIS迁移到Apache,在单声道下运行几乎没有困难。我已经在Linux上成功使用Win Forms运行了未更改的Windows .Net应用程序。

但是,尽管它可以工作,但是如果您使用未在mono上实现的API调用,那么它将无法工作,并且唯一的解决方案是重写您的应用程序,使用Windows或在mono中编写其他内容。