有一个完全用C#编写的程序,它以.NET Framework 2.0为目标.有没有办法我可以以某种方式编译(翻译)托管EXE到本机的EXE,因此它可能是.NET不可知的?我知道可能有商业产品用于此目的......但它们有点贵.
问题是我们要在运行没有安装.NET Framework的Windows XP的计算机上部署该程序.还要求程序的大小不得超过500Kb(最大1Mb),因为它是从Web服务器下载的(现在大小为255Kb).这就是为什么我们无法将完整的.NET FX(甚至是简化的)附加到下载程序的文件中.
显然,这是一个可怕的软件工程错误应该早先检测到并避免,所以我们可以使用像C++这样的本机技术.
我们现在已经尝试过Novell的Mono - 一个用于Linux,MAC和Windows的.NET Framework的开源实现.Mono由C#编译器,IDE,运行时(CLR)和类库程序集组成(如System.dll和mscorlib.dll - 非常类似于安装到GAC的.NET的类库程序集).我们尝试做的是找到CLR文件并将它们与我们程序的文件和一些程序集一起发送.这样,可以通过在用户的计算机上运行"mono program.exe"(命令提示符)来调用该程序.除了给最终用户CLR文件(mono.exe和mono.dll)的这种使用带来的不便之外,总共大约2.5 Mb,远远大于所需的500 Kb甚至1 Mb.
所以,我们没有其他选择,只能通过编译器将我们的.NET应用程序转换为本机应用程序,但问题仍然存在 - 我们应该使用什么编译器以及我们在哪里可以找到...
目前我偶然发现了微软研究院的Singularity OS项目.它是一个开源研究操作系统,用托管代码编写(至少部分).Singularity OS包括一个Bartok编译器,操作系统使用该编译器将托管程序转换为本机程序(x86 32位).应该注意的是,Bartok无法将.NET 2.0的所有方面都转换为本机代码,但大部分都是如此.但是我还没有学会如何使用奇点......
如果你能提供一些有关问题的有用提示和建议,你自己使用Singularity OS和Bartok Compiler的经验,或者我忽略的问题的另一种方法以及解决方法,我将非常感谢你.
非常感谢你提前!
最后,使用Mono的Full AOT功能(在Callum Rogers的建议下)我设法生成了缺少CLI头的program.exe.dll.所以它看起来就像一个原生的dll.但是,我无法弄清楚如何将该DLL转换为exe或使其运行.此dll似乎也没有暴露任何感兴趣的函数,如main函数.