.NET是一次写入,像Java一样运行在任何地方(WORA)平台吗?

时间:2008-09-17 14:50:52

标签: java .net multiplatform

我记得孙的口号如此生动...... "Write Once, Run Anywhere"。这个想法是因为程序被编译成标准字节代码,所以任何带有Java虚拟机的设备都可以运行它。多年来,Java似乎已经在许多平台/设备上实现了它。

这是意图还是.NET的意图。如果是这样,为实现这一目标正在做出哪些努力?

29 个答案:

答案 0 :(得分:8)

为了纠正其他人的一些评论,.Net始终是多平台的。这就是为什么微软将命名空间分为“System。*”(平台中立)和“Microsoft。*”(具体是Windows)。

答案 1 :(得分:6)

Mono可在Linux,Solaris和OS X上运行。实际上.Net仍然是一个仅限Windows的平台。相反,将它推向WORA并不符合微软的利益。然而,似乎是跨平台的。很多人对Linux上的Mono非常偏执。 MS的假设策略是首先让它成为Linux应用程序平台的重要组成部分,然后释放律师。我不会打赌.Net的可移植性。

答案 2 :(得分:5)

答案是非常不稳定的。当您包含外部库时,答案将更改为否。

例如,Microsoft没有64位JET驱动程序。 .NET使用JET来访问MS Access数据库。

为使用MS Access数据库的Any CPU目标编译的任何应用程序都将在64位版本的Windows上失败。

(这忽略了所说的应用程序无法移植到Mono。)

答案 3 :(得分:4)

为了将其置于上下文中,在很多人看来,Java从未在其“随时随地运行”的承诺中实现。

你所得到的最好的是“一次调试一次”或“一次编写看起来像废话”

成功的基于CLR的应用程序都是使用目标平台原生的图形框架编写的。

例如以下非常成功的linux应用程序,其中使用c#绑定到GTK编写GTK#并且不使用像您期望的winforms:

Banshee - 像iTunes一样的音乐播放器

fspot - 照片管理员

TomBoy - 注意节目

GnomeDo - 快速启动器和停靠

同样成功的Windows .net应用程序不是使用GTK#编写的(即使它是跨平台的),它们是使用winforms或WPF编写的。

当google开始制作Chrome时,他们没有尝试使用跨平台的GUI框架,而是选择在每个平台上使用本机GUI框架。为什么?因为这样,应用程序就可以适当地适应它的环境,这样它的外观,感觉和行为就像它在操作系统中的原生一样。

基本上,当你尝试在任何地方进行写作时,你必须做出严肃的妥协,而你最终得到的东西在任何地方都无法正常工作。

业界在很大程度上放弃了曾经在任何地方运行的写作的崇高目标,这是一个在实践中没有成功的好主意。

使用mono / .net的最佳方法是共享较低级别的二进制文件,并在每个目标平台上使用本机gui框架。 Linux上的GTK#,Windows上的winforms或WPF,Mac上的CocoaSharp。这样,您的应用程序将看起来像一个原生应用程序。

答案 4 :(得分:4)

微软从未提出这些说法,但他们正在WORA舞台上采取行动。例如,Silverlight 2.0将使用.NET框架的一个子集,可在Windows,Linux(通过Moonlight项目),MacOS,Windows Mobile和诺基亚手机上使用。

正如其他人所提到的,Mono项目也将框架带到了多个环境中。

答案 5 :(得分:3)

我不认为.NET的官方“意图”是WORA。我认为您可以放心地说.NET的设计使其始终可以在未来的MS OS上运行。但是没有什么可以阻止.NET在其他平台上运行。 Mono是一个为Windows以外的操作系统实现.NET运行时的示例。

答案 6 :(得分:3)

Mono我们已经非常接近了,而SilverLight我们已经在那里了。

答案 7 :(得分:2)

是的,这是.NET的目标,虽然我认为它没有像Java那样强调。目前,我所知道的唯一效果是Mono项目正在创建一个在Linux上运行的CLI版本。

有趣的是,Silverlight实际上有一个缩小版的CLR,它可以在Windows和Mac上运行,这允许同一个Silverlight应用程序在两个平台上都能保持不变。

答案 8 :(得分:1)

意图,或至少是推销,是这样的。实际情况是.NET无法在其他平台上运行。唯一的主要例外是Mono,这是一个开源项目。它本质上是对Linux,Solaris,Mac OS X,Windows和Unix上运行的.NET运行时(相当于java虚拟机)的重写。

这是相当成功的,但它没有得到官方的支持。

如果你想让你的单片Acme公司雇主采用.Net和Linux,那就别忘了。实际上,对于.NET,你是在Windows机器上,期间。

答案 9 :(得分:1)

是的,.NET具有公共语言运行时(CLR),它是与JVM等效的.NET。微软并不像Java那样在许多平台上支持它,但在Mono project的帮助下,可以通过常见的警告来实现跨平台应用程序。

请记住,.NET不仅仅是CLR。这是一个完整的平台。

答案 10 :(得分:1)

是和否。 .NET环境的一部分是标准,可以公开采用。

例如,运行时(CLR)有一个名为Mono的可移植版本,它是一个多平台,开放源代码,并被(例如)Second Life使用。

答案 11 :(得分:1)

理论上,该语言被设计为编译成像Java这样的字节码,由公共语言运行时解释,这种机制也允许多种语言(不仅仅是C#)一起工作并在.NET框架上运行。

但是,Microsoft只开发了适用于Windows的CLR。还有其他非MS替代品正在开发中,最突出的是Mono,CLR实施或许多平台(参见链接)。

所以理论上是的,在实践中 - 我们会看到。

答案 12 :(得分:1)

理论上可行,因为CLR(.Net的“虚拟机”)符合开放标准(CLI)。问题是该标准的其他实现是什么。 Mono是另一项正在进行中的工作,但它是我所知道的另一项工作。

答案 13 :(得分:1)

理论上,是的。 .Net程序集是字节码,使用JIT(“即时”)编译器在启动时转换为本机代码。

实际上,除了Windows之外,没有很多平台具有.Net JIT编译器。有一个用于Linux,名为MONO。

不了解Mac,Sun等......

答案 14 :(得分:1)

我认为.NET的想法是“一次编写,随处运行(微软选择)”。但是,Mono项目正在慢慢改变这种情况。

答案 15 :(得分:1)

在Java,恕我直言的平台上永远不会支持它。

唯一的努力是Mono,不是由Microsoft赞助的。

检查here on SOofficial site

答案 16 :(得分:0)

我认为这个想法是在不同的编程语言之间创建互操作性,而不是WORA。

答案 17 :(得分:0)

简短回答 - 不,Microsoft仅支持.NET的MS操作系统(包括Windows Mobile)。

答案很长 - 有一些公共开源项目可以为Linux和其他操作系统复制.NET框架,特别是Rotor和Mono。它们不支持所有内容,但您可以部署很多.NET代码,包括silverlight。

答案 18 :(得分:0)

如果微软认真对待其他非Windows平台上的dotnet,他们就会释放类库,供其他人重用,并且需要再次重写相同的库。另一方面,Sun已经做到了这一点,如果没有任何一个端口到达另一个平台,那么就会出现更少的障碍。从本质上来说,一个人仍然需要编写一个vm并做本机的东西,但它有助于避免重新实现整个类库的头痛。语言的标准化是一种营销手段,可以抓住技术人员。没有libs的语言毫无价值。尝试使用prjkitive类型来完成你的下一个项目...这是正确的编写你自己的字符串类等,并告诉我标准化语言没有任何可用的库是多么有用...

答案 19 :(得分:0)

但它是多平台Win9x / WinNT / Mobile

答案 20 :(得分:0)

如果WORA真的是一个原始目标,那么我想我们现在会在所有主要平台上看到.NET实现,完全得到微软的支持。我似乎记得当时Sun正在从屋顶上喊出WORA,微软的反击是“写任何(语言)Run on One(平台)”(WARO :-)。正如其他人提到的那样,我认为他们一直都是WORASLAIW的坚定支持者(一次只能在Windows上运行一次写入)

正如你所指出的那样,他们似乎正在改变Silverlight的功能,试图获得一段Flash / Flex动作,因为战场已经远离桌面并向浏览器转移。

答案 21 :(得分:0)

最确定的意思是WORA。这只是MS想象的任何地方到处都是Windows。谁知道Linux和MacOS仍然存在。但是在PDC的所有Mac上判断,我猜他们要么是半对错,要么是错误的!

答案 22 :(得分:0)

鉴于其他人的回应,我仍然不清楚微软是否真的有意将.NET作为一项有争议的举措。真正了解我的唯一方法就是让来自Microsoft .NET团队的人

由于我们无法明确地了解.NET的原始WORA意图,我们可以指出试图实现这一目标的努力(正如先前的答案所述)。

[黑白](http://en.wikipedia.org/wiki/Mono_(software))

这项工作是微软以外的一项举措。

  

Mono是Novell(前身为Ximian)领导的一个项目,旨在创建符合Ecma标准的.NET兼容工具集,其中包括C#编译器和公共语言运行时。 Mono可以在Linux,BSD,UNIX,Mac OS X,Solaris和Windows操作系统上运行。

Silverlight

微软正在大力推行这项工作。 Silverlight 2.0实现了与.NET 3.0相同的框架版本,似乎是尝试通过浏览器将框架成功交付到多个平台。

  

它与Microsoft Windows和Mac OS X操作系统上使用的多个Web浏览器产品兼容。还将支持从Windows Mobile 6和Symbian(Series 60)手机开始的移动设备。

虽然它没有专门针对GNU / Linux带来功能,但显然有一个名为[Moonlight]的第三方自由软件实现(http://en.wikipedia.org/wiki/Moonlight_(runtime))

这似乎是我们目前所知道的,但如前所述,如果来自.NET团队的人可以参与其中以正确澄清WORA是否实际上是一项原创计划,那将非常有用。

答案 23 :(得分:0)

我认为这不是.NET的设计目标 - 微软对于为非Windows平台编写软件的人并不特别感兴趣。

然而,还有Mono项目(http://www.mono-project.com),这是“Novell赞助的一项开放式开发计划,旨在开发UNIX开发平台的UNIX版本。”

答案 24 :(得分:0)

由于CLR在功能上与JVM类似,因此可以使用dotNet。 但我不相信MS有任何意图。 http://www.mono-project.com/Main_Page 可能有用,但它不是MS产品。 顺便说一下,就像广泛的j2ee容器如何为j2ee应用程序覆盖WORA概念一样,除IIS之外的任何东西上运行的ASP.NET应用程序在不同的平台上都不会真正起作用。

答案 25 :(得分:0)

这取决于您对“Anywhere”的定义。 有几种Java虚拟机和.Net框架。 大多数情况下,您不能只为桌面虚拟机/框架编写代码,并希望它能够在手机上运行。

因此。从某种意义上说,即使Java也不是真正的“一次编写,随处运行”。

然而,Java的虚拟机目前在多个操作系统上运行,而.Net框架仅在Windows设备上运行。

有一个名为“Mono”的有趣计划,它在Linux,Solaris,Mac OS X,Windows和Unix上提供.Net支持。请在此处阅读:Mono Site

答案 26 :(得分:0)

由于.NET只能在Windows上正式使用(然后才能正式使用),因此它不是一次写入,而是在任何地方运行。然而,Mono团队正在努力帮助将.NET扩展到Windows之外,但它们总是落后于官方的东西。

答案 27 :(得分:0)

我不认为这是微软为每个平台和设备创建运行时的原始计划,但他们通过使用文档化的(?)中间语言来鼓励这一点。

答案 28 :(得分:0)

多平台当然是在愿景中......现在mono在为其他操作系统实现运行时方面做得很好。

Mono