如果要在无法使用.NET框架的计算机上运行.NET应用程序,请执行以下操作:有什么方法可以将应用程序编译为本地代码?
Answers:
Microsoft有一篇文章描述了如何将MSIL编译为本机代码
您可以使用Ngen。
本机映像生成器(Ngen.exe)是可提高托管应用程序性能的工具。Ngen.exe创建本机映像,即包含已编译的特定于处理器的机器代码的文件,并将其安装到本地计算机上的本机映像缓存中。运行时可以使用来自缓存的本机映像,而不是使用即时(JIT)编译器来编译原始程序集。
不幸的是,您仍然需要框架中的库才能运行程序。我没有MS.Net框架SDK所具有的功能,该功能使您可以将所有必需的文件编译为单个可执行文件
RemoteSoft制作了一个工具,可将.NET应用程序编译为可在不安装.NET的情况下运行的程序包。我没有任何经验:
正如这里提到的其他一些答案一样,您可以使用.NET本机工具将您的应用编译为本机代码。但是,与这些答案不同的是,我将解释如何做。
脚步:
安装dotnet CLI (命令行界面)工具,它是新的.NET Core工具链的一部分。我们将使用它来编译我们的应用程序;您可以在此处找到有关它的好文章。
打开一个shell提示符,然后cd
进入您的应用程序目录。
输入:
dotnet compile --native
而已!完成后,您的应用程序将被编译为单个二进制文件,如下所示:
这将是一个独立的可执行文件;不包括PDB,程序集或配置文件(万岁!)。
另外,如果您想要一个更快的程序,可以运行以下命令:
dotnet compile --native --cpp
这将使用C ++代码生成器(而不是RyuJIT)优化您的程序,因此您的应用程序甚至针对AOT场景进行了优化。
您可以在dotnet CLI GitHub repo上找到更多相关信息。
微软已经宣布了其.NET Native Preview,它将允许在不安装框架的情况下运行.NET应用程序。
看看:http : //blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
常见问题解答:http://msdn.microsoft.com/zh-CN/vstudio/dn642499.aspx
您可以从此处下载适用于VS2013的Microsoft .NET Native:http://msdn.microsoft.com/zh-CN/vstudio/dotnetnative
是的,使用Ngen,本机图像生成器。但是,您需要注意许多事项:
总而言之,只有在需要减少应用程序的启动时间时,才值得使用Ngen。
您可以!但是,您只能使用.NET 1.1(没有通用名称): 单声道提前编译(AOT)
但是,这意味着编译实际上是本机的,因此您将不再能够部署单个字节码程序集,每个平台将需要一个。
最初设计它是因为没有适用于iPhone的.NET或Mono,因此这就是他们制造MonoTouch的方式。
您可以使用称为.NET Native的新的预编译技术来执行此操作。在此处查看:http : //msdn.microsoft.com/zh-CN/vstudio/dotnetnative
当前,它仅适用于Windows Store应用程序。它执行单个组件链接。因此,.NET Framework库是静态链接到您的应用程序的。一切都将编译为本机,并且不再部署IL程序集。应用不会针对CLR运行,而是经过精简,优化的运行时,称为托管运行时(Mrt.dll)
如上所述,NGEN使用混合编译模型,并在动态场景中依赖IL和JIT。.NET Native不使用JIT,但它支持各种动态方案。代码作者需要利用 运行时指令为他们希望支持的动态方案提供提示。
2019年答案:使用dotnet / corert。它可以将.NET Core项目编译为独立.exe
文件。没有依赖关系(系统库之类的除外kernel32.dll
)。我敢打赌这正是OP所需要的。
在其GitHub主页上:
CoreRT编译器可以将托管的.NET Core应用程序编译为易于部署的本机(特定于体系结构的)单文件可执行文件。它还可以产生独立的动态或静态库,这些库可以由以其他编程语言编写的应用程序使用。
编译为Native的主要原因是为了保护您的代码,否则编译的MSIL就像在客户端计算机中部署源代码一样。
NGEN可以编译为本地代码,但也需要部署IL代码,此目的只是为了减少启动时间,但它也没有用。
CoreRt是Alpha版本,仅适用于简单的helloworld类型的应用程序。
.Net Core编译成单个可执行文件,但它也不是本机exe,这只是IL代码的压缩文件,运行时会将代码解压缩到temp文件夹中。
我从Microsoft提出的一个简单问题是,如果RyuJIT可以即时将IL编译为本机,那么为什么不可以提前编译相同的IL(AOT)。
看起来像网络核心RT可行的解决方案;不久所有应用程序都将进入.net核心; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/zh-CN / archive / msdn-magazine / 2018/11月/ net-core-publishing-options-with-net-core
未测试,也许与旧Win .net SDK可能做类似。