是否可以将 .NET IL 代码编译为机器代码?

问题描述 投票:0回答:13

我想在没有 .NET 框架的情况下分发我的 .NET 程序。是否可以将 .NET 程序编译为机器码?

.net visual-studio compiler-construction
13个回答
21
投票

是的,您可以使用 Ngen.exe 进行预编译,但这并不会消除对 CLR 的依赖。

您还必须交付 IL 程序集,Ngen 的唯一好处是您的应用程序可以在不调用 JIT 的情况下启动,因此您可以获得真正快速的启动时间。

根据 C# 的 CLR:

此外,程序集预编译使用 Ngen 通常比 JIT'ed 慢 程序集,因为 JIT 编译器 可以针对目标机器进行优化 (32 位?64 位?特殊寄存器? 等),而 NGEN 只会产生一个 基线编译。

编辑:

关于来自 CLR Via C# 的上述信息存在一些争论,因为有人说您只需要在目标机器上运行 Ngen 作为安装过程的一部分。


20
投票

Remotesoft 有一个: Salamander .NET 链接器

虽然我没有任何经验。


7
投票

有一些第三方工具可以做到这一点,例如


5
投票

另一个可以做到这一点的产品(昂贵且专有,许可证起价为 1599 美元)是Xenocode Postbuild。虽然我自己没用过,但它的成本相当于一个非洲小国的国民生产总值……


4
投票

是的,你现在可以了!最近 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


3
投票

是否可以编译 .NET IL 代码 到机器码?

是的,但 .NET Framework 会在运行时(默认)或安装时 (ngen) 为您完成。除其他原因外,此 IL -> 机器代码在每台安装机器上单独完成,因此可以针对该特定机器进行优化。

我想分发我的 .NET 没有 .NET 框架的程序。 是否可以编译 .NET 程序到机器码?

不,无论出于何种意图和目的,您都不能这样做。第 3 方解决方法可能在某些情况下有效,但到那时我真的不会再将其视为“托管代码”或“.NET”了。


2
投票

编译部分有IL2CPU


1
投票

我不认为这是可能的。你可以制作一个预编译的程序集,但你仍然需要框架。


1
投票

如果您只关心部署框架的大小,您可以阅读this


1
投票

我认为你不应该:那是 JIT 编译器的任务。

但是,您可以使用 ClickOnce 或 Windows Installer 来部署它,这样缺少的框架就不是什么大问题:您可以告诉安装程序下载框架并安装它。


1
投票

查看 MONO 项目:带有 --aot 选项的 mono 命令。 http://www.mono-project.com/AOT


0
投票

我一直认为在没有 CLR 依赖的情况下直接将 c# 编译为机器代码会很酷……


0
投票

对于那些使用 .NET Core 或更新的 .NET (5+) 的用户,有一个 Self-Contained 部署选项,在 MSDN 中描述为

输出发布文件夹包含应用程序的所有组件, 包括 .NET 库和目标运行时。应用程序被隔离 来自其他 .NET 应用程序并且不使用本地安装的共享 运行。您的应用程序的用户不需要下载和安装 .NET.

准备独立部署的步骤:

  • 将解决方案配置从调试切换到发布。
  • 右键单击解决方案资源管理器中的项目并选择发布。
  • 选择文件夹作为目标,然后单击下一步。
  • 再次选择文件夹作为特定目标,然后单击下一步。
  • 在“位置”选项卡中,浏览您的目标二进制文件路径并单击“完成”。
  • 在“发布”选项卡中,单击小铅笔图标(编辑目标运行时) 目标运行时行的末尾。
  • 在配置文件设置对话框(如下所示)中,从部署模式组合框中选择自包含。
  • 从目标运行时组合框中选择您的运行时。
  • (可选)从目标位置组合框中指定二进制文件的输出路径。
  • 点击保存。
  • 当您单击“发布”选项卡中的“发布”按钮时,您的二进制文件将 已创建。

还有其他部署选项,例如 Azure、Docker Container Registry 等,但为了简单起见,我选择了文件夹选项。请注意,步骤和屏幕截图属于 VS 2019。

有关更多信息,请参阅独立发布

© www.soinside.com 2019 - 2024. All rights reserved.