【发布时间】:2009-11-22 14:42:33
【问题描述】:
有一个完全用 C# 编写的针对 .NET Framework 2.0 的程序。 有没有一种方法可以以某种方式将托管的 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)的使用带来的不便之外,最终用户 CLR 文件(mono.exe 和 mono.dll)的总大小约为 2.5 Mb,远大于所需的 500 Kb 甚至 1 Mb。
因此,我们别无选择,只能通过编译器将 .NET 应用程序转换为本机应用程序,但问题仍然存在 - 我们应该使用什么编译器以及在哪里可以找到...
目前,我偶然发现了 Microsoft Research 的 Singularity OS 项目。它是一个开源研究操作系统,用托管代码(至少部分)编写。 Singularity OS 包括一个 Bartok 编译器,操作系统使用该编译器将托管程序转换为本机程序(x86 32 位)。应该注意的是,Bartok 不能将 .NET 2.0 的所有方面都翻译成本机代码,但其中大部分都是。但是我还没有学会如何使用奇点...
如果您能为我提供一些关于该问题的有用提示和建议、您自己使用 Singularity OS 和 Bartok 编译器的经验或解决我忽略的问题的其他方法以及解决方法,我将非常感谢您。
提前非常感谢您!
最后,使用 Mono 的完整 AOT 功能(根据 Callum Rogers 的建议),我设法生成了一个缺少 CLI 标头的 program.exe.dll。 所以在我看来它就像一个原生 dll。但是我不知道如何将该 dll 转换为 exe 或使其运行。 此外,这个 dll 似乎没有公开任何感兴趣的函数,例如 main 函数。
【问题讨论】:
-
你是想做这个跨平台,还是只是删除对框架库的依赖?
-
我只是想删除 .NET Framework 的依赖项,以便它可以在没有安装 .NET FX 的 Windows XP 上运行。
-
这是一个很好的问题,我什至可以补充一点,Windows 7 附带安装了 .NET 3.5 SP1。可悲的是,但有时会在目标计算机上找到旧版操作系统,但安装了旧版(最好的情况)或没有(最坏的情况)安装了 .NET。