.NET平台是否独立于特定平台?

6

.NET是一种独立于语言的平台。

但它是否也具有平台无关性呢?如何实现?

编辑: 我听说,.NET 4.0 是考虑到平台无关性而开发的!希望这能超过Java,如果可以的话!

编辑: 答案取决于我们如何定义“平台”,例如.NET适用于Windows平台,而Mono适用于Java。

但问题是,难道我们没有通用开发平台,它是与操作系统无关的吗!

操作系统的独立性是否与平台无关性相关?

15个回答

19

这实际上是关于如何定义“平台”的问题。

例如,只要平台是.NET,.NET就是跨平台的;同样的,只要平台是Java,Java也是跨平台的。也就是说,.NET(和Java)在某种程度上可以被视为自身的平台(CLR、JVM)。只要针对特定物理平台有该平台的实现可用,就可以独立地在其上运行已编译的代码。

归根结底,“跨平台独立性”就像“一次编写,随处运行”一样,是一种市场宣传手段。但在实践中,目前有许多基于JVM的具体平台可用,而.NET则没有那么多(虽然像Mono项目这样的倡议旨在改变这一点)。


.NET/Mono可以运行在目前市面上大多数常见的CPU上,包括Wii/PS3/X360。 - Dykam
2
.NET和Java平台在很多方面都非常不同,因为.NET包含Windows特定的功能(例如System.Windows.Forms),而Java没有平台特定的功能。正因为这个原因,除了Microsoft操作系统之外,没有任何其他完整/兼容的.NET实现(Mono并不完全完整/兼容)。相反,Java确实有完整且兼容多个操作系统的实现。 - mikera

10

要回答这个问题,我认为必须首先清楚地区分CLI和.NET:

  • CLI(Common Language Infrastructure的缩写)是一个标准,因此它主要设计为跨平台。在这里,平台指底层计算机架构,包括操作系统。

    虽然该标准可能需要某些不可能在所有架构上实现的东西(我想到了非常有限的平台,如嵌入式系统),但这些可能被视为边缘情况。

  • .NET是微软对CLI的主要实现,仅在Windows系统上运行。因此,.NET不是跨平台的。

    更新(2015年8月):在2014年底,微软宣布计划逐步开放.NET Framework的部分内容(特别是与服务器端应用程序相关的部分)。其结果是.NET Core.NET Foundation提供。

  • .NET Core旨在成为CLI的跨平台实现。

  • Mono也是CLI的一种实现,但是它设计用于在不同的平台上工作,例如Linux和Windows。Mono肯定比.NET更加跨平台。


其次,还有编译器输出的二进制兼容性问题。因为CLI标准定义了用于程序集的文件格式(一种PE可执行文件形式)和中间代码语言(称为CIL),所以一旦源代码已被编译成CIL,就可以自由地混合使用VB.NET、C#和其他一些语言编写的组件。
从这个意义上说,CLI(以及所有符合它的实现,如.NET)是与语言无关的。
有趣的是,你可以使用Microsoft的.NET编译器编译某些东西,并且由于标准规定的公共程序集文件格式,你应该能够在Mono项目中使用该程序集,反之亦然。从这个意义上说,.NET编译器工具链可以被认为是平台无关的,但.NET本身不是。请记住,.NET Framework还包含针对Windows的标准库(例如WPF)。

6

来自维基百科:

  • 不是的。DotNet不是平台无关的。
  • 微软.NET原生运行在Windows上。然而,一个开源实现Mono允许它在开源系统上运行。但是,它并不支持所有的.NET类,所以不要期望任何东西能够完全运行。
  • 正如你们所知道的,在.NET中,有不同的编译器,例如C# - CSC VB - VBC等。当你的代码被编译后,它将转换为独立的MSIL代码。这个MSIL代码将会进入CLR,而这个CLR是依赖于平台的,即对于Unix平台,你应该有Unix类型的CLR,对于Windows也是一样,因此我们可以说.NET代码是平台无关的。

请参考Cumbayah的回答:.NET不是跨平台的,就像Java的Windows实现也不是跨平台的。 - RCIX
@RCIX - 我的回答也说了,.NET不是平台无关的,但正如Cumbayah所说,这实际上取决于你如何定义平台。如果将操作系统视为平台,则.NET不是平台无关的。但是,如果将CLR视为平台,则.NET代码是平台无关的。那么你能解释一下我的回答有什么不清楚的地方吗? - Sachin Shanbhag
你表达的方式非常令人困惑,说.NET不是跨平台的,但如果考虑另一件事情,它就是跨平台的。:S - RCIX
@RCIX - 实际上这是从WIKI链接中指出的。 我认为这可能是不同人的答案的组合。 - Sachin Shanbhag

3

我不确定您的问题是什么,但如果您想知道.NET应用程序是否可以在任何操作系统上运行,答案是否定的。

.NET Framework只针对某些操作系统,比如Windows。其他项目可用于其他平台,例如Linux上的Mono。


2

DotNet并非平台独立或者可能只是部分独立,而Java则完全平台独立,因为它有JVM(Java虚拟机)。

最好的例子来理解Java的独立性就是,如果安装了JVM(Java虚拟机),您可以在“汽车”微波炉、洗衣机或任何计算机上运行Java程序。

Java字节码是独立自由的,无论我们使用Mac、Windows、Unix等操作系统都没有问题。


2

1

好的。.NET Framework 是否是跨平台取决于“平台”实际上意味着什么。

如果平台 = 操作系统,那么 .NET Framework 不是跨平台的,.NET Core 是。

如果平台 = 独立系统/PC,那么是的,因为 CLR/CLI(就像 Java 的 JVM 一样),.NET Framework 是跨平台的。


1

Mono 是 .NET 的跨平台实现,但它不受 Microsoft 支持并且缺少一些功能。


Silverlight是微软支持的.NET跨平台子集。 - Joel Mueller
1
@Sjoerd,严格来说(抱歉我有点苛刻,但我觉得值得指出),Mono是CLI的一种实现。它是.NET的一种替代方案(.NET本身实现了CLI)。 - stakx - no longer contributing

1

在 Linux 上可能有一些 .NET 实现,其他系统上也可以编译。
它被称为 Mono


Mono支持Mac OS X、Linux、Windows和Solaris。请访问http://www.go-mono.com/mono-downloads/download.html。 - Michael Shimmins
-1 是因为 Mono 只实现了 .NET 的一个子集,并不试图与整个 .NET 兼容。它不能保证您(也很可能永远无法)完全移植 .NET 应用程序,因为 .NET 包含 Windows 特定的功能(例如 System.Windows.Forms 的部分内容)。 - mikera
@mikera,你听起来好像提到mono会伤害你的感情一样...虽然很明显mono并不完全支持.NET,我怀疑是否有人相信它会支持。 - bua

1

只要你坚持使用 .Net 2.0 版本,.Net 在 MacOSX 和 Linux 上都能正常工作。一些新的功能,如 LINQ、C# 3.0 等也已经实现。但需要注意的是,在不同平台上,文件路径、文件权限等并不完全相似。

忘了提到我说的是 Mono。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接