代码之家  ›  专栏  ›  技术社区  ›  Niyaz

如何将.NET应用程序编译为本机代码?

  •  85
  • Niyaz  · 技术社区  · 17 年前

    如果我想在.NET框架不可用的计算机中运行.NET应用程序,有没有任何方法可以将应用程序编译为本机代码?

    11 回复  |  直到 9 年前
        1
  •  42
  •   Espo    17 年前

    微软有一篇文章描述了你如何 Compile MSIL to Native Code

    你可以使用 Ngen .

    本机映像生成器(ngen.exe) 是改善 托管应用程序的性能。 ngen.exe创建本机映像,其中 文件是否包含已编译的 处理器特定的机器代码,以及 将它们安装到本机映像中 本地计算机上的缓存。这个 运行时可以使用来自 缓存而不是使用 (JIT)编译原始文件的编译器 装配。

    不幸的是,为了运行程序,您仍然需要框架中的库。我不知道MS.NET Framework SDK有什么功能可以让您将所有必需的文件编译成一个可执行文件。

        2
  •  23
  •   Simon Steele    17 年前

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

    RemoteSoft Salamander

        3
  •  19
  •   Erick Sgarbi    17 年前

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

    使用ngen,您仍然需要安装.NET框架,但是使用这样的工具,您的所有托管代码都会编译成本机代码,这样您就可以将其部署到不存在框架的计算机上。

        4
  •  18
  •   thepirat000    11 年前

    微软已经宣布 .NET本机预览 这将允许在未安装框架的情况下运行.NET应用程序。

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

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

    您可以从以下位置下载Microsoft.NET Native for VS2013: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

        5
  •  15
  •   Community CDub    8 年前

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

    步骤:

    1. 安装 dotnet CLI (命令行界面)工具,它是新的.NET核心工具链的一部分。我们将用它来编译我们的应用程序;你可以找到一篇关于它的好文章。 here.

    2. 打开shell提示并 cd 到应用程序的目录。

    3. 类型:

      dotnet compile --native
      

    就是这样!完成后,您的应用程序将编译为单个二进制文件,如下所示:

    Native compiled .NET Core EXE

    它将是一个独立的可执行文件;不包含PDB、程序集或配置文件(hooray!).


    或者,如果您想要一个更快的程序,您可以运行它:

    dotnet compile --native --cpp
    

    这将优化你的程序使用C++代码生成器(而不是RJJIT),所以你的应用程序甚至更加优化的AOT场景。

    您可以在dotnet cli上找到更多有关此的信息。 GitHub repo .

        6
  •  11
  •   Chris Zwiryk    17 年前

    是的,使用 Ngen ,本机图像生成器。但是,您需要注意以下几点:

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

    总之,只有在需要缩短应用程序的启动时间时,才有必要使用ngen。

        7
  •  10
  •   Camilo Martin    13 年前

    你可以!但是,您被限制为.NET 1.1(您没有泛型): Mono Ahead-Of-Time compilation (AOT)

    然而,这意味着编译实际上是本地的,所以您将无法再部署一个字节码程序集,每个平台需要一个。

    它最初的设计是因为iPhone没有.net或Mono,所以他们就是这样制作MonoTouch的。

        8
  •  6
  •   m_eric    11 年前

    您可以使用名为.NET Native的新的预编译技术来实现这一点。在这里查看: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

    目前它仅适用于Windows应用商店应用程序。它执行单个组件链接。因此.NET框架库静态链接到您的应用程序中。所有内容都编译到本机,不再部署IL程序集。应用程序不是针对clr运行的,而是一个精简的、优化的运行时,称为托管运行时(mrt.dll)。

    如上所述,NGen使用了混合编译模型,并且在动态场景中依赖于IL和JIT。.NET本机不使用JIT,但它支持各种动态方案。代码作者需要利用 Runtime Directives 为.NET本机编译器提供有关其希望支持的动态方案的提示。

        9
  •  4
  •   Matt Bishop    17 年前

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

    这并不能解决你的问题,真的。

        10
  •  1
  •   spoulson    17 年前

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

    也许有黑客这么做,但我觉得不安全。需要框架的动态太多,例如:动态程序集加载、MSIL代码生成等。

        11
  •  -3
  •   aku    17 年前

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