关于编译:如何将.NET应用程序编译为本地代码?

How to compile a .NET application to native code?

如果要在无法使用.NET框架的计算机上运行.NET应用程序,请执行以下操作: 有什么方法可以将应用程序编译为本机代码?


Microsoft有一篇文章描述了如何将MSIL编译为本机代码

您可以使用Ngen。

The Native Image Generator (Ngen.exe)
is a tool that improves the
performance of managed applications.
Ngen.exe creates native images, which
are files containing compiled
processor-specific machine code, and
installs them into the native image
cache on the local computer. The
runtime can use native images from the
cache instead using the just-in-time
(JIT) compiler to compile the original
assembly.

不幸的是,您仍然需要框架中的库才能运行程序。我没有MS.Net框架SDK所具有的功能,该功能使您可以将所有必需的文件编译为单个可执行文件


RemoteSoft制作了一个工具,可将.NET应用程序编译为可在不安装.NET的情况下运行的程序包。我没有任何经验:

RemoteSoft am


我已经测试了其中的几个,目前唯一支持.NET 3.5并具有出色虚拟化堆栈的是Xenocode Postbuild

使用ngen,您仍然需要安装.NET框架,但是使用这样的工具,将所有托管代码编译为本机代码,因此您可以将其部署到没有框架的机器上。


微软已经宣布了其.NET Native Preview,它将允许在不安装框架的情况下运行.NET应用程序。

看看:http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx

常见问题解答:http://msdn.microsoft.com/zh-CN/vstudio/dn642499.aspx

您可以从此处下载适用于VS2013的Microsoft .NET Native:http://msdn.microsoft.com/zh-CN/vstudio/dotnetnative


正如这里提到的其他一些答案一样,您可以使用.NET本机工具将您的应用编译为本机代码。但是,与这些答案不同的是,我将解释如何做。

脚步:

  • 安装dotnet CLI(命令行界面)工具,它是新的.NET Core工具链的一部分。我们将使用它来编译我们的应用程序;您可以在这里找到有关它的好文章。

  • 打开一个shell提示符,然后cd到您的应用程序目录。

  • 输入:

    1
    dotnet compile --native
  • 而已!完成后,您的应用程序将被编译为单个二进制文件,如下所示:

    Native compiled .NET Core EXE

    这将是一个独立的可执行文件;不包括PDB,程序集或配置文件(万岁!)。

    另外,如果您想要一个更快的程序,可以运行以下命令:

    1
    dotnet compile --native --cpp

    这将使用C ++代码生成器(而不是RyuJIT)优化您的程序,因此您的应用程序甚至针对AOT场景进行了优化。

    您可以在dotnet CLI GitHub存储库中找到关于此的更多信息。


    是的,使用本地图像生成器Ngen。但是,您需要注意许多事项:

    • 您仍然需要CLR运行可执行文件。
    • CLR不会根据其运行的环境(例如486 vs. 586 vs. 686等)动态优化您的程序集。

    总而言之,只有在需要减少应用程序的启动时间时,才值得使用Ngen。


    您可以!但是,您只能使用.NET 1.1(没有通用名称):
    单声道提前编译(AOT)

    但是,这意味着编译实际上是本机的,因此您将不再能够部署单个字节码程序集,每个平台将需要一个。

    最初设计它是因为没有适用于iPhone的.NET或Mono,因此这就是他们制造MonoTouch的方式。


    您可以使用称为.NET Native的新的预编译技术来执行此操作。在此处查看:http://msdn.microsoft.com/zh-CN/vstudio/dotnetnative

    当前,它仅适用于Windows Store Apps。它执行单个组件链接。因此,.NET Framework库是静态链接到您的应用程序的。一切都将编译为本机,并且不再部署IL程序集。应用不会针对CLR运行,而是经过精简,优化的运行时,称为托管运行时(Mrt.dll)

    如上所述,NGEN使用混合编译模型,并在动态场景中依赖IL和JIT。 .NET Native不使用JIT,但它支持各种动态方案。代码作者需要利用运行时指令为他们希望支持的动态方案提供提示。


    您可以使用ngen.exe生成本机映像,但是您仍然必须分发原始的非本机代码,并且它仍然需要在目标计算机上安装框架。

    确实不能解决您的问题。


    2019年答案:使用dotnet / corert。它可以将.NET Core项目编译为独立的.exe文件。没有依赖关系(除了像kernel32.dll这样的系统库之外)。我敢打赌这正是OP所需要的。

    在其GitHub主页上:

    The CoreRT compiler can compile a managed .NET Core application into a native (architecture specific) single-file executable that is easy to deploy. It can also produce standalone dynamic or static libraries that can be consumed by applications written in other programming languages.


    .NET的本质是能够安装已编译为MSIL的应用程序,然后通过JIT或Ngen安装,MSIL被编译为本机代码并本地存储在缓存中。从未打算生成可独立于.NET框架运行的真正的本机.exe。

    也许有一些黑客可以做到这一点,但这对我来说并不安全。有太多需要框架的动态特性,例如:动态程序集加载,MSIL代码生成等。


    我认为这是不可能的。您还需要分发.NET FW。如果要将.NET应用程序编译为本机代码,请使用NGen工具


    推荐阅读