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

Niy*_*yaz 85 .net compilation native-code

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

Esp*_*spo 43

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

你可以使用Ngen.

Native Image Generator(Ngen.exe)是一种可以提高托管应用程序性能的工具.Ngen.exe创建本机映像,这些映像是包含已编译的特定于处理器的计算机代码的文件,并将它们安装到本地计算机上的本机映像缓存中.运行时可以使用来自缓存的本机映像,而不是使用实时(JIT)编译器来编译原始程序集.

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

  • 除了表演之外,我找不到任何其他理由使用它。CLR 代码仍然可以像以前一样阅读,并且您仍然需要 .NET。令人失望的是,微软没有提供一个工具来解决我认为是一个大问题的问题(任何人都可以按原样查看您的高级代码) (2认同)
  • 然而,现在是兴奋的时候了,看起来 .net 框架终于获得了本机编译器 - http://msdn.microsoft.com/en-US/vstudio/dotnetnative (2认同)

Sim*_*ele 23

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

RemoteSoft蝾螈

  • 在过去的几年里,我尝试了几次,以获取信息或评估,但他们从不回复我关于定价或演示的电子邮件,所以我认为他们的产品可能有点可疑。 (4认同)
  • 这是我听过的唯一一个可以在不需要框架的情况下完成的工具.当然,它的成本为1249美元. (3认同)

Eri*_*rbi 19

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

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


the*_*000 18

微软已经发布了.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


Jam*_* Ko 17

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

脚步:

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

  2. 打开shell提示符并打开cd应用程序的目录.

  3. 输入:

    dotnet compile --native
    
    Run Code Online (Sandbox Code Playgroud)

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

本机编译的.NET Core EXE

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


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

dotnet compile --native --cpp
Run Code Online (Sandbox Code Playgroud)

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

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


Chr*_*ryk 11

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

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

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


Cam*_*tin 9

您可以!但是你只能使用.NET 1.1(没有适用于你的泛型): Mono Ahead-Time-Time编译(AOT)

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

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


cod*_*ion 9

您可以使用NativeAOT(.NET 7 的一部分,以前称为CoreRT)。

这项技术有一点限制,因为你不能过多依赖反射,但总的来说你可以用它来编译应用程序的范围。Web 应用程序、WinForms 应用程序、控制台应用程序。

从 .NET 7 Preview 5 开始,您只需添加

<PropertyGroup>
   <PublishAot>true</PublishAot>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

如果您想使用 NativeAOT 的日常构建,您需要在项目文件中添加以下行

<PropertyGroup>
   <PublishAot>true</PublishAot>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

并将dotnet8Nuget feed 添加到您的 nuget.config 中,如下所示

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <packageSources>
    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
    <clear />
    <add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" />
    <add key="dotnet8" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json" />
 </packageSources>
</configuration>
Run Code Online (Sandbox Code Playgroud)

您可以针对 .NET 6 应用程序,并且通过 .NET 6 中的 ILTrim 改进,越来越多的代码将准备好进行本机编译。

对于简单的应用程序,您可以尝试使用BFlat,这可能会给您带来更好的结果。


m_e*_*ric 6

您可以使用名为.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编译器提供提示.


Mat*_*hop 5

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

这确实不能解决你的问题。