是否有可能将.NET IL代码编译为机器代码?

问题描述:

我想分发我的.NET程序没有.NET框架。是否有可能将.NET程序编译为机器码?是否有可能将.NET IL代码编译为机器代码?

是的,你可以使用Ngen.exe进行预编译,但是这并不能消除CLR依赖。

您还必须运送IL程序集,Ngen的唯一好处是您的应用程序可以在不调用JIT的情况下启动,因此您可以获得真正快速的启动时间。

根据CLR通过C#:

此外,组件采用 NGEN预编译通常比JIT'ed慢 组件因为JIT编译器 可以优化到目标机器 (32位64?位?特殊寄存器? 等),而NGEN只会产生 基准编译。

编辑:

有从CLR通过C#以上信息的一些争论,如某些人所说,你需要在目标机器上只安装过程的一部分运行NGEN。

+0

ngen程序集为什么会变慢? ngen在目标机器上被调用,所以实际上不应该有所作为。 哦,而ngen不是问题的实际答案。 – OregonGhost 2008-09-26 17:41:40

+0

Ngen由开发人员调用,用于预编译应用程序,而不是在目标机器上。请阅读C#中关于Ngen的部分。 – FlySwat 2008-09-26 17:49:26

+3

乔恩,这取决于。 `ngen`可以被目标机器上的安装过程调用,并且据我所知这实际上是针对在.NET中实现的各种Microsoft产品完成的。 – 2008-09-26 17:50:54

我不认为这是可能的。你可以做一个prejitted程序集,但你仍然需要这个框架。

Remotesoft有一个: Salamander .NET Linker

我没有任何与它的经验,虽然。

+1

这个问题已经被问过,并再次,这是唯一正确的答案。这是可能的,但有代价。 – chrissie1 2008-09-26 17:25:44

我认为你不应该:这是JIT编译器的任务。

但是,您可以使用ClickOnce或Windows Installer进行部署,以便丢失的框架不是一个很大的问题:您可以告诉安装程序下载框架并安装它。

有一些第三方工具可以做到这一点,例如

另一个(昂贵的和专有的,牌照为$ 1599年开始)的产品,可以做到这一点Xenocode Postbuild。虽然我自己并没有使用它,但它花费的是非洲小国的国民生产总值和所有...

我一直认为将c#直接编译为机器代码而不需要CLR依赖虽然...

如果你只关心部署框架的大小,你可能会阅读this

是否有可能将.NET IL代码 编译为机器码?

是的,但.NET Framework在运行时(默认)或安装时(ngen)为您执行。除此之外,这个IL - >机器代码是在每台安装机器上单独完成的,所以它可以针对特定机器进行优化。

我想分发我的.NET 没有.NET框架的程序。 是否有可能将.NET 程序编译为机器码?

不,对于所有意图和目的,您不能这样做。第三方解决方案可能在某些情况下工作,但到那时我不会再真正将其视为“托管代码”或“.NET”。

编译部分有IL2CPU

看看MONO项目:带有--aot选项的mono命令。 http://www.mono-project.com/AOT

是的,你现在可以!最近微软公布了.NET Native,这是一种利用.NET Native运行时(他们称之为MRT)将应用程序编译成一个二进制文件(实际上是一个可执行文件和一个动态库)的技术。

见链接: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx http://blogs.msdn.com/b/dotnet/archive/2014/04/24/dotnetnative-performance.aspx