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

如果我想在.NET框架不可用的机器上运行.NET应用程序; 有没有办法将应用程序编译为本机代码?

Niyaz asked 2019-09-11T02:43:03Z
12个解决方案
42 votes

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

你可以使用Ngen。

本机图像生成器(Ngen.exe)   是一个改善的工具   托管应用程序的性能。   Ngen.exe创建本机映像   是包含已编译的文件   特定于处理器的机器代码,以及   将它们安装到本机映像中   缓存在本地计算机上。该   运行时可以使用来自的本机映像   使用即时缓存来缓存   (JIT)编译器编译原始   部件。

不幸的是,您仍然需要框架中的库才能运行您的程序。 我所知道的MS .Net框架SDK没有任何功能允许您将所有必需的文件编译成单个可执行文件

Espo answered 2019-09-11T02:43:37Z
23 votes

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

RemoteSoft蝾螈

Simon Steele answered 2019-09-11T02:44:06Z
19 votes

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

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

Erick Sgarbi answered 2019-09-11T02:44:37Z
18 votes

微软已经发布了.NET Native Preview,它允许在没有安装框架的情况下运行.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]

thepirat000 answered 2019-09-11T02:45:20Z
16 votes

正如这里提到的其他一些答案,您可以使用.NET Native工具将您的应用程序编译为本机机器代码。 然而,与那些答案不同,我将解释如何做到这一点。

脚步:

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

  2. 打开shell提示符并将dotnet compile --native 打开到您的应用程序目录。

  3. 输入:

    dotnet compile --native
    

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

Native compiled .NET Core EXE

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


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

dotnet compile --native --cpp

这将使用C ++代码生成器(而不是RyuJIT)优化您的程序,因此您的应用程序甚至更适合AOT方案。

您可以在dotnet CLI GitHub repo上找到更多相关信息。

James Ko answered 2019-09-11T02:46:43Z
11 votes

是的,使用Ngen,Native Image Generator。 但是,您需要注意以下几点:

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

总而言之,如果您需要缩短应用程序的启动时间,那么仅使用Ngen是值得的。

Chris Zwiryk answered 2019-09-11T02:47:27Z
9 votes

您可以! 但是,您仅限于.NET 1.1(没有适用于您的泛型):Mono Ahead-Of-Time编译(AOT)

但是,这意味着编译实际上是原生的,因此您将无法再部署单个字节码程序集,每个平台需要一个。

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

Camilo Martin answered 2019-09-11T02:48:04Z
6 votes

您可以使用名为.NET Native的新预编译技术来完成此操作。 在这里查看:[http://msdn.microsoft.com/en-US/vstudio/dotnetnative]

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

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

m_eric answered 2019-09-11T02:48:42Z
4 votes

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

真的,哪个不能解决你的问题。

Matt Bishop answered 2019-09-11T02:49:12Z
1 votes

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

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

spoulson answered 2019-09-11T02:49:43Z
0 votes

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

从它的GitHub主页:

CoreRT编译器可以将托管的.NET Core应用程序编译为易于部署的本机(特定于体系结构)的单文件可执行文件。 它还可以生成独立的动态或静态库,可以由其他编程语言编写的应用程序使用。

brk answered 2019-09-11T02:50:20Z
-3 votes

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

aku answered 2019-09-11T02:50:45Z
translate from https://stackoverflow.com:/questions/45702/how-to-compile-a-net-application-to-native-code