是否可以将.NET IL代码编译为机器代码?
我想在没有.NET框架的情况下分发我的.NET程序。是否可以将.NET程序编译为机器代码?
解决方案
我认为不可能。我们可以进行预先组装的程序集,但仍需要该框架。
Remotesoft有一个:
Salamander .NET链接器
我没有任何经验。
是的,我们可以使用Ngen.exe进行预编译,但这不会消除CLR依赖性。
我们仍然必须同时交付IL程序集,Ngen的唯一好处是应用程序可以在不调用JIT的情况下启动,因此我们获得了真正的快速启动时间。
根据CLR通过C#:
Also, assemblies precompiled using Ngen are usually slower than JIT'ed assemblies because the JIT compiler can optimize to the targets machine (32-bit? 64-bit? Special registers? etc), while NGEN will just produce a baseline compilation.
编辑:
关于通过C#通过CLR提供的上述信息有一些争论,有人说我们只需要在安装过程中在目标计算机上运行Ngen。
我认为我们不应该:这是JIT编译器的任务。
但是,我们可以使用ClickOnce或者Windows Installer对其进行部署,以使丢失的框架不是什么大问题:我们可以告诉安装程序下载并安装该框架。
有一些第三方工具可以执行此操作,例如
- http://www.remotesoft.com/linker/
- http://www.xenocode.com/
可以做到这一点的另一种(昂贵且专有的许可证起价为1599美元)是Xenocode Postbuild。不过我自己还没有使用过它,它花费了一个非洲小国的国民生产总值以及所有其他...
我一直认为,尽管没有CLR依赖关系,直接编译CTO机器代码也很酷。
如果我们只关心框架的部署规模,则可以阅读有关内容。
Is it possible to compile .NET IL code to machine code?
是的,但是.NET Framework在运行时(默认)或者安装时(ngen)为我们完成了此操作。除其他原因外,此IL->机器代码是在每台安装机器上单独完成的,因此可以针对该特定机器进行优化。
I would like to distribute my .NET programs without the .NET framework. Is it possible to compile a .NET program to machine code?
不,出于所有意图和目的,我们不能这样做。第三方变通办法可能在某些情况下可行,但是到那时我将不再真正将其视为"托管代码"或者" .NET"。
编译部分有IL2CPU。
看一下MONO项目:带有--aot选项的mono命令。 http://www.mono-project.com/AOT