关于编译:如何将.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工具


    推荐阅读

      linux交叉编译命令?

      linux交叉编译命令?,工具,平台,位置,网上,环境,基础,代码,编译器,路径,目标,

      linux编译源代码命令?

      linux编译源代码命令?,工具,代码,百度,最新,环境,项目,系统,电脑,密码,内核,l

      linux编译时显示命令?

      linux编译时显示命令?,系统,基础,工具,代码,百度,下来,网上,命令,内核,文件,L

      linux进程运行命令?

      linux进程运行命令?,系统,工作,状态,地址,信息,进程,基础,命令,管理,软件,lin

      linux只能命令行编译?

      linux只能命令行编译?,系统,代码,工具,软件,密码,平台,项目,设计,最新,设备,L

      linux显示运行命令?

      linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如

      linux运行vim命令?

      linux运行vim命令?,系统,工具,官方网站,模式,基础,数据,代码,环境,入口,命令

      linux监控命令运行?

      linux监控命令运行?,系统,工作,地址,信息,工具,情况,标准,环境,命令,状态,lin

      linux命令行编译c?

      linux命令行编译c?,代码,环境,系统,工具,平台,终端,程序,编辑,文件,源程序,在

      linux中命令停止运行?

      linux中命令停止运行?,系统,代码,第一,命令,进程,指令,程序,方法,接线,硬盘,l

      linux中如何编译命令?

      linux中如何编译命令?,系统,代码,基础,暂停,环境,工具,百度,命令,文件,终端,

      linux自动运行命令?

      linux自动运行命令?,服务,系统,时间,代码,周期性,第一,命令,管理,在线,状态,l

      linux开启运行命令?

      linux开启运行命令?,系统,服务,工作,管理,状态,命令,标准,情况,环境,工具,lin

      linux运行wps命令?

      linux运行wps命令?,软件,官网,名称,时间,电脑,系统,工具,环境,项目,数据,wps

      linux运行cmd命令?

      linux运行cmd命令?,电脑,系统,状态,情况,环境,命令,单位,管理,设备,数据,电脑

      linux编译连接命令?

      linux编译连接命令?,系统,代码,环境,工具,文件,资料,电脑,百度,终端,命令,在l

      linux运行两个命令?

      linux运行两个命令?,网络,地址,系统,工作,暂停,命令,网站,密码,网上,入口,Lin

      linux命令运行代码?

      linux命令运行代码?,代码,单位,系统,环境,连续,保险,工具,命令,文件,音乐,Lin

      linux内核编译命令?

      linux内核编译命令?,系统,软件,环境,电脑,内核,最新,下来,官网,体系,名字,在l

      linux命令运行脚本?

      linux命令运行脚本?,代码,系统,工作,设计,状态,命令,脚本,文件,目录,终端,运