如何将.NET应用程序编译为本机代码?
如果我想在.NET框架不可用的机器上运行.NET应用程序, 有什么办法将应用程序编译为本机代码?
Microsoft有一篇文章描述了如何将MSIL编译为Native Code
你可以使用Ngen 。
本机映像生成器(Ngen.exe)是一个提高托pipe应用程序性能的工具。 Ngen.exe创build本地映像,这是包含编译处理器特定机器代码的文件,并将它们安装到本地计算机上的本机映像caching中。 运行时可以使用来自caching的原生图像,而不是使用即时(JIT)编译器来编译原始程序集。
不幸的是,你仍然需要框架中的库来运行你的程序。 我没有使用MS .Net框架SDK知道的function,它允许您将所有必需的文件编译成单个可执行文件
RemoteSoft制作了一个工具,可以将.NET应用程序编译为可在未安装.NET的情况下运行的程序包。 我没有任何经验:
RemoteSoft蝾螈
我testing了其中的几个,在这一刻,唯一一个支持.NET 3.5并且还有一个很好的虚拟化堆栈是Xenocode Postbuild
使用ngen,你仍然需要安装.NET框架,但是使用一个工具,所有的托pipe代码都被编译成本地代码,这样你就可以将它部署到没有框架存在的机器上。
微软已经发布了它的.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
您可以从这里下载适用于VS2013的Microsoft .NET Native: http : //msdn.microsoft.com/zh-CN/vstudio/dotnetnative
是的,使用本地图像生成器Ngen 。 但是,有一些事情需要注意:
- 您仍然需要CLR来运行您的可执行文件。
- CLR不会根据运行的环境dynamic地优化你的程序集(例如,486 vs. 586 vs. 686等)
总而言之,如果您需要缩短应用程序的启动时间,那么只需要使用Ngen。
您可以! 然而,你仅限于.NET 1.1(没有你的generics): 单声道时间编译(AOT)
但是,这意味着编译是真正的本地,所以你将不再能够部署一个单一的字节码组合,你将需要一个平台。
它最初devise是因为没有用于iPhone的.NET或Mono,所以这就是他们制作MonoTouch的方式。
正如这里提到的其他答案一样,您可以使用.NET Native工具将您的应用程序编译为本地机器代码。 不像那些答案,我会解释如何去做。
脚步:
-
安装dotnet CLI (命令行界面)工具,它是新的.NET Core工具链的一部分。 我们将使用它来编译我们的应用程序; 你可以在这里find一篇关于它的好文章。
-
打开一个shell提示符,并
cd
到你的应用程序的目录。 -
input这个:
dotnet compile --native
而已! 完成后,您的应用程序将被编译为单个二进制文件,如下所示:
这将是一个独立的可执行文件; 不包含PDB,程序集或configuration文件(hooray!)。
另外,如果你想要一个更快的程序,你可以运行这个:
dotnet compile --native --cpp
这将优化您的程序使用C ++代码生成器(而不是RyuJIT),所以你的应用程序甚至更优化的AOT场景。
你可以在dotnet CLI的GitHub仓库中find更多的信息。
您可以使用称为.NET Native的新预编译技术来执行此操作。 看看这里: http : //msdn.microsoft.com/en-US/vstudio/dotnetnative
目前,它仅适用于Windowsapp store应用。 它执行单个组件链接。 所以.NET框架库被静态链接到你的应用程序中。 一切都编译为本地和IL程序集不再部署。 应用程序不会针对CLR运行,而是一个精简的,运行时优化的运行时(Managed Runtime,Mrt.dll)
如上所述,NGEN使用混合编译模型,并依靠IL和JIT进行dynamic场景。 .NET Native不使用JIT,但它确实支持各种dynamic场景。 代码作者需要利用运行时指令来向.NET Native编译器提供他们希望支持的dynamic场景的提示。
您可以使用ngen.exe来生成本机映像, 但是您仍然必须分发原始的非本机代码,并且仍然需要在目标机器上安装框架。
这并不能解决你的问题,真的。
.NET的本质是能够安装已编译为MSIL的应用程序,然后通过JIT或Ngen将MSIL编译为本地代码并存储在caching中。 它从来没有打算生成一个真正的本地.exe,可以独立于.NET框架运行。
也许有一些这样做,但它不是对我来说安全。 有太多的dynamic需要框架,如:dynamic组装,MSIL代码生成等。
我认为这是不可能的。 您还需要分发.NET FW。 如果您想将.NET应用程序编译为本机代码,请使用NGen 工具
截至2012年,您现在可以使用集成到VS 2012中的“便携式类库”。