2009-11-22 55 views
19

有一个完全用C#编写的程序,其目标是.NET Framework 2.0。 有没有办法我可以以某种方式编译(翻译)托管的EXE到本地的一个,所以它可能是.NET的不可知论者?我知道这可能是商业产品......但它们有点贵。将.NET应用程序转换为x86本机代码

问题是,我们要在运行Windows XP且未安装.NET Framework的计算机上部署该程序。还要求程序的大小不得超过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应用程序转换为原生一个,但问题依然存在 - 我们应该用什么样的编译器,我们在那里能找到一个...

现在我已经偶然发现了Microsoft Research的Singularity OS项目。它是一个用托管代码编写的开源研究操作系统(至少部分)。 Singularity操作系统包括一个Bartok编译器,操作系统使用该编译器将托管程序转换为本地程序(x86 32位)。应该指出的是,Bartok不能将.NET 2.0的所有方面都转换为本地代码,但大部分都是这样。然而我还没有学会如何使用奇点...

如果你能提供给我关于这个问题的一些有用的技巧和建议,你对Singularity OS和Bartok编译器的经验,我将非常感激你或者另一种方法解决我忽视的问题和解决方法。

非常感谢您提前!

最后,使用Mono的完整AOT功能(在Callum Rogers的建议中),我设法生成了缺少CLI标头的program.exe.dll。 因此,它看起来像我本土的DLL。但我不知道如何将该DLL转换为exe或使其运作。 此外,这个dll似乎没有公开任何感兴趣的功能,如主功能。

+3

莱欺骗:http://stackoverflow.com/questions/45702/is-there-some-way-to-compile-a-net-application-to-native-代码 –

+0

您是试图制作这个跨平台,还是只是删除框架库的依赖关系? –

+0

我只是试图删除.NET Framework的依赖关系,以便它可以在没有安装.NET FX的Windows XP上运行。 – Vlad

回答

1

不是真的.NET到本机转换的解决方案,但也许这会有所帮助:http://www.yoda.arachsys.com/csharp/faq/#framework.required

+0

谢谢。我会关注清单中提到的方案。然而,据我所知这些程序并不是很便宜,但可能会有一个重要的负载,即我们的可执行文件的大小将超过所需的数字。 – Vlad

+0

该链接似乎已经死亡。 –

0

不太清楚,有什么可以做,除了精心重写应用程序。为了减轻已经发生的负担,您可以使用Reflector(到Microsoft C++)反汇编.NET应用程序,并将其作为基础开始,并将其替换为本机引用。

+1

我希望能找到一种避免在C++中重写整个应用程序的方法,因为这需要花费大量的时间和最重要的调试时间。 – Vlad

9

从Mono项目中检出AOT(Ahead Of Time)编译。这会将您的托管项目编译为本机exe或elf可执行文件(取决于您的目标系统),不需要JIT。这是用于将单声道应用程序加载到iPhone上的技术(不允许JIT/Framework),并且还具有启动时间更快,内存使用率更低以及人们更难以反编译代码的优点。你说你已经在使用Mono,所以它应该兼容。

阅读关于它at the mono-project.com websiteat Miguel de Icaza's blog(和iPhone info)。

请注意,您不能使用动态代码或通用接口,如

interface IFoo<T> { 
... 
    void SomeMethod(); 
} 

,你将不得不编译所有你使用的库的DLL文件。 PS:确保为您的问题使用“完整”AOT。

+0

感谢您的回答。看起来我之前曾尝试以这种方式编译示例Hello World程序集,但它失败了。可能是因为[Mono的完整AOT]与每个处理器都不兼容(我有Intel Core 2 Duo)。但是,我将彻底检查完整AOT,因为我有可能做错了什么 – Vlad

+0

完整的AOT至少适用于x86和x86-64,以及ARM和PPC处理器。 – Gonzalo

+0

最后,我设法产生了缺少CLI标头的program.exe.dll。所以它看起来像一个本地的DLL。但我不知道如何将该dll转换为exe或使其运作。此外,这个dll似乎没有公开任何感兴趣的功能,例如主功能 – Vlad

3

有一个名为CrossNet的项目解析.Net程序集并生成非托管C++代码,可以在任何标准编译器中进行编译。

+0

它解析程序集或代码吗?很抱歉问,但项目似乎让我感到困惑。 –

8

2017年更新

由于@jenix's comment,.NET本机仅适用于Windows应用商店的应用程序(UWP)。在宣布3年之后,这仍然是事实,.net本地桌面版可能会被微软删除。所以这个答案不再适用。

对于控制台应用程序,您可以使用.net核心Self-contained deployments (SCD)。即使是一个hello世界的应用程序,你的包也将达到50MB +。您仍然需要安装VC运行时。

========

微软宣布.NET本地预览上构建2014

随着.NET原生开发者预览版,应用程序将被部署在终端用户设备的完全独立的本地编译代码,并且不会依赖目标设备/机器上的.NET Framework。因此,.NET Native在目标机器上不需要.NET框架。

Announcing .NET Native Preview
Microsoft .NET Native

+3

虽然.NET Native仅适用于Windows应用商店应用。 – Jenix

+0

@JenixGuy是,2年后。 – prime23

相关问题