这是一个完全使用C#编写,面向.NET Framework 2.0的程序。 有没有办法将托管的可执行文件编译为本地代码,使其不依赖于.NET?我知道可能有商业产品可以实现这个目的……但它们有点昂贵。
问题在于,我们需要在运行没有安装.NET Framework的Windows XP计算机上部署该程序。还有一个要求是,程序的大小不能超过500Kb(最大1Mb),因为它是从Web服务器下载的(目前大小为255Kb)。因此,我们无法将完整的.NET FX(甚至是精简版)附加到下载的程序文件中。
很明显,这是一种可怕的软件工程错误,早期应该被发现和避免,以使用像C++之类的本地技术。
目前我们尝试使用Novell的Mono——一个适用于Linux、MAC和Windows的.NET Framework的开源实现。Mono由C#编译器、集成开发环境、运行时(CLR)和类库(如System.dll和mscorlib.dll——非常类似于.NET的类库,在GAC中安装)组成。 我们尝试做的是找到CLR文件,并将其与我们的程序文件和一些程序集一起打包。这样,用户可以通过在计算机上运行“mono program.exe”(命令提示符)来调用程序。 除了这种使用方式的不便外,CLR文件(mono.exe和mono.dll)总共约为2.5 Mb,远大于所需的500Kb甚至1 Mb。
因此,我们别无选择,只能通过编译器将我们的.NET应用程序转换为本地应用程序,但问题仍然存在——我们应该使用哪个编译器,以及在哪里可以找到它……
目前我偶然发现了微软研究部门的Singularity OS项目,它是一个开源研究操作系统,至少部分是用托管代码编写的。Singularity OS包括Bartok编译器,该操作系统使用它将托管程序转换为本机程序(x86 32位)。需要注意的是,Bartok无法将.NET 2.0的所有方面都转换为本机代码,但可以转换大部分内容。但是我还没有学会如何使用Singularity...
如果您能就这个问题向我提供一些有用的提示和建议,分享一下您对Singularity OS和Bartok编译器或其他解决此问题的方法的经验,我将不胜感激。
非常感谢!
最后,在Callum Rogers的建议下,利用Mono的Full AOT功能,我成功生成了一个program.exe.dll文件,但它缺少CLI标头。因此,它看起来像一个本机dll。但是我无法弄清楚如何将该dll转换为exe或使其运作。此外,该dll似乎没有公开任何重要函数,如主函数。