假设我想在一台没有.NET框架的机器上运行.NET应用程序,是否有办法将应用程序编译为本机代码?
假设我想在一台没有.NET框架的机器上运行.NET应用程序,是否有办法将应用程序编译为本机代码?
Microsoft有一篇文章介绍了如何将MSIL编译为本地代码Compile MSIL to Native Code
你可以使用Ngen.
本机映像生成器(Ngen.exe)是一个提高托管应用程序性能的工具。Ngen.exe创建本机映像,这些文件包含已编译的处理器特定机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机映像,而不是使用即时(JIT)编译器编译原始程序集。
不幸的是,你仍然需要框架的库才能运行程序。据我所知,MS .Net框架SDK中没有功能可以将所有所需文件编译为单个可执行文件。
正如其他答案所提到的,您可以使用.NET Native工具将应用程序编译为本机机器代码。然而,与那些答案不同的是,我将解释如何做到这一点。
步骤:
安装dotnet CLI(命令行界面)工具,它是新的.NET Core工具链的一部分。我们将使用它来编译我们的应用程序;你可以在这里找到一个好的文章:这里。
打开shell提示符并cd
到您的应用程序目录。
输入以下内容:
dotnet compile --native
就这样!完成后,您的应用程序将被编译成一个单独的二进制文件,如下所示:
它将是一个独立的可执行文件;不包括PDB、程序集或配置文件(太好了!)。
或者,如果您想要一个更快的程序,您可以运行以下命令:
dotnet compile --native --cpp
使用C++代码生成器(而不是RyuJIT)来优化您的程序,以便您的应用在AOT场景下更加优化。
您可以在dotnet CLI GitHub库上找到更多信息。
dotnet compile
时,发现它不可用。也许可以尝试使用dotnet build --self-contained
作为替代。 - BolpatRemoteSoft制作了一个工具,可以将.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
您可以从这里下载适用于VS2013的Microsoft .NET Native:http://msdn.microsoft.com/en-US/vstudio/dotnetnative
是的,可以使用本机图像生成器Ngen。 但是,有一些事情需要注意:
总的来说,只有在需要减少应用程序启动时间时才使用Ngen会更加值得。
该技术在某种程度上有一定限制,因为您不能过度依赖反射,但总体上您可以使用它来编译各种应用程序,如Web应用程序、WinForms应用程序和控制台应用程序。
截至.NET 7预览版5,您只需添加以下代码
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.DotNet.ILCompiler" Version="8.0.0-*" />
</ItemGroup>
并将 dotnet8
Nuget 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>
您可以针对.NET 6应用程序进行定位,而在.NET 6中的ILTrim改进下,越来越多的代码都将准备好进行本机编译。
对于简单的应用程序,您可以尝试使用BFlat,这可能会给您带来更好的结果。
你可以这样做!但是你只能使用.NET 1.1(没有泛型可用):Mono Ahead-Of-Time编译(AOT)
然而,这意味着编译成本地代码,所以你将不能再部署一个单一的字节码程序集,而是需要为每个平台都准备一个程序集。
最初设计此技术是因为iPhone没有.NET或Mono,所以他们开发出了MonoTouch。