如何将 .NET 应用程序编译为本机代码?
-
09-06-2019 - |
题
如果我想在.NET框架不可用的机器上运行.NET应用程序;有什么方法可以将应用程序编译为本机代码吗?
解决方案
Microsoft 有一篇文章描述了如何 将 MSIL 编译为本机代码
您可以使用 恩根.
本机映像生成器(NGEN.EXE)是改善托管应用程序性能的工具。ngen.exe创建本机映像,该图像包含包含编译的处理器特定机器代码的文件,并将其安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机映像,而是使用“ jut-time”(JIT)编译器来编译原始组件。
不幸的是,您仍然需要框架中的库才能运行您的程序。据我所知,MS .Net 框架 SDK 没有任何功能可以让您将所有必需的文件编译为单个可执行文件
其他提示
RemoteSoft 制作了一个工具,可以将 .NET 应用程序编译成无需安装 .NET 即可运行的包。我对此没有任何经验:
微软已经宣布其 .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
正如这里的一些其他答案所提到的,您可以使用 .NET 本机 将您的应用程序编译为本机机器代码的工具。然而,与这些答案不同的是,我会解释 如何 去做吧。
脚步:
安装 点网 CLI (命令行界面)工具,它是新的 .NET Core 工具链的一部分。我们将使用它来编译我们的应用程序;你可以找到一篇关于它的好文章 这里。
打开 shell 提示符并
cd
到您的应用程序的目录。输入:
dotnet compile --native
就是这样!完成后,您的应用程序将被编译为单个二进制文件,如下所示:
它将是一个独立的可执行文件;不包含 PDB、程序集或配置文件(万岁!)。
或者,如果您想要更快的程序,您可以运行以下命令:
dotnet compile --native --cpp
这将使用 C++ 代码生成器(而不是 RyuJIT)优化您的程序,因此您的应用程序针对 AOT 场景更加优化。
您可以在 dotnet CLI 中找到更多相关信息 GitHub 仓库.
是的,使用 恩根, ,本机图像生成器。但是,您需要注意以下几点:
- 您仍然需要 CLR 来运行可执行文件。
- CLR 不会根据其运行环境(例如,486对586对686等)
总而言之,只有当您需要减少应用程序的启动时间时,才值得使用 Ngen。
你可以!但是,您仅限于 .NET 1.1(没有适合您的泛型):Mono 提前编译 (AOT)
然而,这意味着编译实际上是本机的,因此您将不再能够部署一个字节码程序集,每个平台都需要一个。
它最初是因为没有适用于 iPhone 的 .NET 或 Mono 而设计的,所以他们就是这样制作 MonoTouch 的。
您可以使用称为 .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 编译器提供有关它们希望支持的动态场景的提示。
您可以使用 ngen.exe 生成本机映像 但 您仍然必须分发原始的非本机代码,并且仍然需要在目标计算机上安装框架。
这确实不能解决你的问题。
.NET 的本质是能够安装已编译为 MSIL 的应用程序,然后通过 JIT 或 Ngen,将 MSIL 编译为本机代码并存储在本地缓存中。它从来没有打算生成一个可以独立于 .NET 框架运行的真正的本机 .exe。
也许有一些黑客可以做到这一点,但对我来说听起来并不安全。有太多的动态需要框架,比如:动态程序集加载、MSIL代码生成等
2019年答案:使用 点网/corert. 。它可以将.NET Core项目编译成独立的 .exe
文件。没有依赖项(除了系统库,例如 kernel32.dll
)。我敢打赌这正是OP所需要的。
从其 GitHub 主页:
CoreRT 编译器可以将托管 .NET Core 应用程序编译为易于部署的本机(特定于体系结构)单文件可执行文件。它还可以生成独立的动态或静态库,可供用其他编程语言编写的应用程序使用。
我认为这是不可能的。您还需要分发 .NET FW。如果要将 .NET 应用程序编译为本机代码,请使用 NGen 工具