.net MSIL文件是否完全跨平台?

.net MSIL文件是否完全跨平台?,.net,vb.net,.net,Vb.net,可能相关的问题: );我不相信这完全回答了我的问题,但它确实回答了我的另一个稍微相关的问题 我来自跨平台语言的国度。我对Python非常在行,对Java非常在行,但效率很高。我知道.pyc文件或多或少会在运行相同版本Python的任何系统上运行,而.jar文件或多或少会在运行Java的任何机器上运行(不包括文字烤面包机)。我想知道.msil文件在.NET环境中是否也能同样工作 因此,为了充分推断我的问题: 虽然x86是目前占主导地位的体系结构,但也有运行在ARM上的Windows机器编译

可能相关的问题:

  • );我不相信这完全回答了我的问题,但它确实回答了我的另一个稍微相关的问题
我来自跨平台语言的国度。我对Python非常在行,对Java非常在行,但效率很高。我知道.pyc文件或多或少会在运行相同版本Python的任何系统上运行,而.jar文件或多或少会在运行Java的任何机器上运行(不包括文字烤面包机)。我想知道.msil文件在.NET环境中是否也能同样工作

因此,为了充分推断我的问题:

虽然x86是目前占主导地位的体系结构,但也有运行在ARM上的Windows机器编译为MSIL的Visual Basic文件(或更一般地说,使用.NET framework的文件)是否会在ARM驱动的Windows机器上以本机方式运行?例如Windows Phone或其中一款RT平板电脑。 编辑:还想知道这些文件是否会在Mono中以本机方式运行,因为我刚刚了解到这是一件事。 编辑:通常是将代码发送到以后编译还是预编译好

如果我不理解MSIL文件是什么,我道歉。我下个季度要离开我的课堂,我可能只是误解了MSIL是什么

IL是一种中间语言。没有处理器能够理解VB.NET或C#编译器生成的MSIL。不是x86进程或ARM

这种中间语言需要JIT(实时)编译成处理器能够真正理解的机器指令。本例中的JIT是.NET Framework公共语言运行时的一部分。因此,如果该平台有JIT/CLR,那么是的,您可以在其上执行MSIL,但只能通过CLR执行。这也称为虚拟机

也就是说,对于更流行的平台,如x86、x86-64和ARM(尽管WoA在许多方面受到限制),甚至安腾,都有CLR/JIT

还有一些其他的事情要考虑。C#和VB.NET不必编译为MSIL,这正是它们传统的工作方式。在某些情况下,它们不会。例如,Xamarin编译器将C#编译为ARM,使用提前编译直接从C#生成ARM代码。对于iOS,在这种情况下没有“中间”语言


一般来说,将代码交付以后编译还是提前编译目标平台更好

这完全取决于您的工具支持和您正在尝试开发的内容。从历史上看,C#和VB.NET只能编译为MSIL。微软没有制造一个将C#编译成本机代码的编译器。Xamarin专门为ARM iOS设备提供此功能。据我所知,除了iOS,您无法在任何平台上进行AoT编译。从理论上讲,JIT编译有一些显著的优势。例如,Intel Core 2 Duo处理器与第四代i7处理器之间存在许多差异。i7有很多Core2Duo没有的指令集和功能。然后,JIT可以生成非常优化的CPU指令,即使它们是相同的体系结构,也无法移植到其他CPU


然而,Windows应用商店应用程序是另一回事。虽然它们可以在C#和VB.NET中开发,但用户可以使用最近发布的.NET本机从为其体系结构预编译的商店下载它们。

这非常有用,但我想问一点更多的信息:一般来说,将代码交付以后编译,还是提前为目标平台编译更好?我这样问是因为,在我看来,我觉得ARM设备上的JIT能够更好地处理一些极端情况,例如(这太简单了,我几乎不知道我在说什么)ARM芯片需要一个特定的命令,但Xamarin不知道如何编译该部分,导致可能已通过JIT编译器解决的错误。这有意义吗?如果没有,我可以重写。