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

时间:2020-03-06 14:47:44  来源:igfitidea点击:

我想在没有.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