我记得孙杨的口号是如此生动…… “一次编写,随处运行”。这个想法是,由于程序被编译成标准字节码,任何带有 Java 虚拟机的设备都可以运行它。多年来,Java 似乎已经进入了许多平台/设备。
这是.NET的意图还是曾经的意图。如果是这样,正在采取什么样的努力来实现这一目标?
我记得孙杨的口号是如此生动…… “一次编写,随处运行”。这个想法是,由于程序被编译成标准字节码,任何带有 Java 虚拟机的设备都可以运行它。多年来,Java 似乎已经进入了许多平台/设备。
这是.NET的意图还是曾经的意图。如果是这样,正在采取什么样的努力来实现这一目标?
为了在这里纠正其他人的一些评论,.Net 总是打算成为多平台的。这就是为什么 Microsoft 将命名空间分为“System.*”(与平台无关)和“Microsoft.*”(特定于 Windows)。
Mono可以在 Linux、Solaris 和 OS X 上运行。实际上,.Net 仍然几乎是一个仅限 Windows 的平台。相反,推动它成为 WORA 并不真正符合微软的利益。然而,似乎是跨平台的。很多人对 Linux 上的 Mono 非常偏执。MS的设想策略是先让它成长为Linux应用平台的重要组成部分,然后再放开律师。我不会把我的未来押在 .Net 的可移植性上。
答案是一个非常不稳定的Yes。包含外部库的那一刻,答案将变为否。
例如,Microsoft 没有 64 位 JET 驱动程序。.NET 使用 JET 访问 MS Access 数据库。
为使用 MS Access 数据库的 Any CPU 目标编译的任何应用程序在 64 位版本的 Windows 上都将失败。
(这忽略了上述应用程序不能移植到 Mono。)
微软从未提出过这些要求,但他们正在 WORA 领域采取行动。例如,Silverlight 2.0 将使用 .NET 框架的一个子集,并可在 Windows、Linux(通过 Moonlight 项目)、MacOS、Windows Mobile 和诺基亚手机上使用。
正如其他人所提到的,Mono 项目也将框架带到了多个环境中。
将这一点放在上下文中,在许多人看来,Java 也从未兑现其“Write Once Run Anywhere”的承诺。
充其量你得到的是“Write Once Debug Everywhere”或“Write Once Looks like crap Everywhere”
成功的基于 CLR 的应用程序都是使用目标平台本机的图形框架编写的。
例如,以下非常成功的 linux 应用程序使用 c# 绑定到 GTK 编写,称为 GTK#,而不像您期望的那样使用 winforms:
Banshee - 像 iTunes 一样的音乐播放器
fspot - 照片管理器
TomBoy - 笔记程序
GnomeDo - 快速启动器和扩展坞
同样成功的 windows .net 应用程序不是使用 GTK# 编写的(即使它是跨平台的),它们是使用 winforms 或 WPF 编写的。
当谷歌开始制作 Chrome 时,他们并没有尝试使用跨平台的 GUI 框架,而是选择在每个平台上使用原生的 GUI 框架。为什么?因为这样应用程序就可以正确地融入它的环境,它的外观、感觉和行为就像它在操作系统上的本机一样。
基本上,当您尝试在任何地方运行一次写入时,您必须做出严重的妥协,而您最终得到的东西在任何地方都无法真正正常工作。
该行业已在很大程度上放弃了一次编写随处运行的崇高目标,因为这是一个在实践中没有成功的好主意。
使用 mono/.net 的最佳方法是共享较低级别的二进制文件并在每个目标平台上使用本机 gui 框架。linux 上的 GTK#,windows 上的 winforms 或 WPF,Mac 上的 CocoaSharp。这样,您的应用程序的外观和感觉就像原生应用程序。
有了 Mono,我们已经很接近了,有了 SilverLight,我们已经准备好了。
我不认为 .NET 的官方“意图”是 WORA。我认为您可以肯定地说 .NET 的设计是为了始终在未来的 MS 操作系统上运行。但是没有什么可以阻止 .NET 在其他平台上运行。Mono 是为 Windows 以外的操作系统实现 .NET 运行时的示例。
是的,这是 .NET 的一个目标,尽管我认为它不像 Java 那样强调它。目前,我所知道的唯一努力是 Mono 项目,它正在创建一个在 Linux 上运行的 CLI 版本。
有趣的是,Silverlight 实际上有一个精简版的 CLR,它可以在 Windows 和 Mac 上运行,它允许相同的 Silverlight 应用程序在两个平台上运行而无需更改。
这在理论上是可能的,因为 CLR(.Net 的“虚拟机”)符合开放标准(CLI)。问题是该标准还有哪些其他实现。Mono 是另一项正在进行的工作,但它是我所知道的唯一另一项工作。
我认为 .NET 的想法是它是“一次编写,随处运行(Microsoft 选择)”。然而,Mono项目正在慢慢改变这种情况。
理论上,是的。.Net 程序集是字节码,它在启动时使用 JIT(“即时”)编译器转换为本机代码。
实际上,除了 Windows 之外,没有多少平台具有 .Net JIT 编译器。Linux 有一个,叫做 MONO。
不知道Mac,Sun等...
从理论上讲,该语言被设计为编译成类似 Java 的字节码,由公共语言运行时解释,这种机制还允许多种语言(不仅仅是 C#)一起工作并在 .NET 框架上运行。
但是,Microsoft 只开发了适用于 Windows 的 CLR。还有其他非 MS 替代方案正在开发中,最突出的是Mono、CLR 实现或许多平台(请参阅链接)。
所以理论上是的,在实践中——我们拭目以待。
是和不是。.NET 环境的一部分是标准的,可以公开采用。
例如,运行时 (CLR) 有一个称为Mono的可移植版本,它是多平台、开源的,并由(例如)Second Life 使用。
目的,或者至少是音调,是为了这种情况。现实情况是.NET 不能真正在其他平台上运行。唯一的主要例外是Mono,它是一个开源项目。它本质上是对适用于 Linux、Solaris、Mac OS X、Windows 和 Unix 的 .NET 运行时(相当于 java 虚拟机)的重写。
它相当成功,但没有得到官方的支持。
如果您正在考虑让您的单体 Acme corp 雇主采用 .Net 和 Linux,那就别管它了。实际上,使用 .NET,您就在 Windows 机器上。
是的,.NET 具有公共语言运行时 (CLR),它是 .NET 等效于 JVM。Microsoft 在与 Java 一样多的平台上不支持它,但在Mono 项目的帮助下,可以实现具有通常警告的跨平台应用程序。
请记住,.NET 不仅仅是 CLR。它是一个完整的平台。
我不认为这真的是 .NET 的设计目标——微软对为非 Windows 平台编写软件的人没有特别的兴趣......
但是,有一个 Mono 项目 ( http://www.mono-project.com ),它是“Novell 赞助的一个开放式开发计划,旨在开发一个开放源代码的 UNIX 版本的 .NET 开发平台”。
由于 .NET 仅在 Windows 上(正式)可用,因此不是,它不是编写的,可以在任何地方运行。然而,Mono 团队正在努力帮助将 .NET 传播到 Windows 之外,但他们总是落后于官方的东西。
我不认为微软最初的计划是为每个平台和设备创建运行时,但他们通过使用有文档的(?)中间语言来鼓励这样做。
简短的回答——不,Microsoft 仅支持 .NET 的 MS 操作系统(包括 Windows Mobile)。
长答案 - 有公共开源项目可以为 linux 和其他操作系统复制 .NET 框架,特别是 Rotor 和Mono。它们并不支持一切,但您可以部署大量 .NET 代码,包括 silverlight。
这取决于您对“任何地方”的定义。有多种 Java 虚拟机和 .Net 框架。而且大多数时候你不能只为桌面虚拟机/框架编写代码并期望它在手机上运行。
所以。从某种意义上说,即使是 Java 也不是真正纯粹的“一次编写,随处运行”。
然而,Java 的虚拟机目前在多个操作系统上运行,而 .Net 框架仅在 Windows 设备上运行,这是事实。
有一个有趣的倡议叫做“Mono”,它在 Linux、Solaris、Mac OS X、Windows 和 Unix 上提供 .Net 支持。在这里阅读:单站点
我认为这个想法是在不同的编程语言之间创建互操作性,而不是 WORA。
它肯定是 WORA。现在只是 MS 认为 Anywhere 和 Everywhere 将是 Windows。谁知道 Linux 和 MacOS 仍然存在。但从 PDC 的所有 Mac 来看,我猜他们要么对了一半,要么错了一半!
dotNet 可以,因为 CLR 在功能上与 JVM 类似。但我不相信 MS 有任何意图。 http://www.mono-project.com/Main_Page 可能有用,但它不是 MS 产品。顺便说一句,就像广泛的 j2ee 容器如何为 j2ee 应用程序云计算 WORA 概念一样,在 IIS 之外的任何东西上运行的 ASP.NET 应用程序在不同平台上都不会真正工作。
鉴于其他人的回应,我仍然不清楚微软是否真的打算让 .NET 成为 WORA 倡议。我想真正了解的唯一方法是让Microsoft .NET 团队中的某个人参与进来。
由于我们无法明确了解 .NET 的最初 WORA 意图,我们可以指出试图使之成为现实的努力(正如之前的答案所讨论的那样)。
这项工作是在 Microsoft 之外开展的一项举措。
Mono 是由 Novell(以前由 Ximian)领导的项目,旨在创建符合 Ecma 标准的 .NET 兼容工具集,其中包括 C# 编译器和公共语言运行时。Mono 可以在 Linux、BSD、UNIX、Mac OS X、Solaris 和 Windows 操作系统上运行。
微软正在大力推行这项工作。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 是否实际上是一项原创计划,那将非常有帮助。
如果 WORA 真的是一个最初的目标,那么我想我们现在会在所有主要平台上看到 .NET 实现,并得到 Microsoft 的完全支持。我似乎记得,当 Sun 从屋顶上大喊 WORA 时,微软的回击是“Write Any (language) Run on One (platform)”(WARO:-)。正如其他人所提到的,我认为他们一直是 WORASAIW 的坚定支持者(只要它的 Windows 就可以在任何地方编写一次运行)
正如您所指出的,由于战场已显着从桌面转移到浏览器,他们似乎正在对 Silverlight 进行一些改变,以尝试获得 Flash/Flex 动作的一部分。
但它是多平台 Win9x/WinNT/Mobile
如果微软认真对待其他非 Windows 平台上的 dotnet,他们会发布类库以供其他人重用,从而避免再次重写相同的库。另一方面,Sun 已经做到了这一点,这意味着如果没有人希望移植到另一个平台,就会出现更少的障碍。自然地,使用 java 仍然需要编写一个 vm 并做本地的东西,但它有助于避免重新实现整个类库的头痛。语言的标准化是吸引技术人员的营销策略。没有库的语言毫无价值。尝试使用 prjkitive 类型来做你的下一个项目......这是正确的,编写你自己的字符串类等,并告诉我在没有任何可用库的情况下标准化语言有多大帮助......