我想在没有 .NET 框架的情况下分发我的 .NET 程序。是否可以将 .NET 程序编译为机器码?
是的,您可以使用 Ngen.exe 进行预编译,但这并不会消除对 CLR 的依赖。
您还必须交付 IL 程序集,Ngen 的唯一好处是您的应用程序可以在不调用 JIT 的情况下启动,因此您可以获得真正快速的启动时间。
根据 C# 的 CLR:
此外,程序集预编译使用 Ngen 通常比 JIT'ed 慢 程序集,因为 JIT 编译器 可以针对目标机器进行优化 (32 位?64 位?特殊寄存器? 等),而 NGEN 只会产生一个 基线编译。
编辑:
关于来自 CLR Via C# 的上述信息存在一些争论,因为有人说您只需要在目标机器上运行 Ngen 作为安装过程的一部分。
Remotesoft 有一个: Salamander .NET 链接器
虽然我没有任何经验。
有一些第三方工具可以做到这一点,例如
另一个可以做到这一点的产品(昂贵且专有,许可证起价为 1599 美元)是Xenocode Postbuild。虽然我自己没用过,但它的成本相当于一个非洲小国的国民生产总值……
是的,你现在可以了!最近 Microsoft 宣布了 .NET Native,这是一项将您的应用程序与 .NET Native 运行时(他们称之为 MRT)编译成一个二进制文件(实际上是一个可执行文件和一个动态库)的技术。
查看链接: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx http://blogs.msdn.com/b/dotnet/archive/2014/04/24/dotnetnative-performance.aspx
是否可以编译 .NET IL 代码 到机器码?
是的,但 .NET Framework 会在运行时(默认)或安装时 (ngen) 为您完成。除其他原因外,此 IL -> 机器代码在每台安装机器上单独完成,因此可以针对该特定机器进行优化。
我想分发我的 .NET 没有 .NET 框架的程序。 是否可以编译 .NET 程序到机器码?
不,无论出于何种意图和目的,您都不能这样做。第 3 方解决方法可能在某些情况下有效,但到那时我真的不会再将其视为“托管代码”或“.NET”了。
编译部分有IL2CPU
我不认为这是可能的。你可以制作一个预编译的程序集,但你仍然需要框架。
如果您只关心部署框架的大小,您可以阅读this。
我认为你不应该:那是 JIT 编译器的任务。
但是,您可以使用 ClickOnce 或 Windows Installer 来部署它,这样缺少的框架就不是什么大问题:您可以告诉安装程序下载框架并安装它。
查看 MONO 项目:带有 --aot 选项的 mono 命令。 http://www.mono-project.com/AOT
我一直认为在没有 CLR 依赖的情况下直接将 c# 编译为机器代码会很酷……
对于那些使用 .NET Core 或更新的 .NET (5+) 的用户,有一个 Self-Contained 部署选项,在 MSDN 中描述为
输出发布文件夹包含应用程序的所有组件, 包括 .NET 库和目标运行时。应用程序被隔离 来自其他 .NET 应用程序并且不使用本地安装的共享 运行。您的应用程序的用户不需要下载和安装 .NET.
准备独立部署的步骤:
还有其他部署选项,例如 Azure、Docker Container Registry 等,但为了简单起见,我选择了文件夹选项。请注意,步骤和屏幕截图属于 VS 2019。
有关更多信息,请参阅独立发布。