即时编译C#

时间:2012-09-14 10:05:40

标签: c# android xamarin.android

可以使用monodroid在Android设备上编译C#代码吗? 我想在我的Android平板电脑上运行C#代码,monodroid看起来像是可能的解决方案,但是如果monodroid编译器只能在windows / mac或Android上运行,我没有发现任何通知。

2 个答案:

答案 0 :(得分:7)

我原本打算将此作为对Chris Sinclair的回答发表评论,但认为它的结尾时间足够长,以至于它可能是一个单独的答案。

我写了C#给Go,所以我可以在那里提供一些评论。它实际上是使用Mono for Android编写的。但是,说Mono for Android进行从C#到Java的转换或编译是不正确的。应用程序中的C#代码在Mono运行时之上运行,可调用接口用于在运行时之间来回交谈(有关详细信息,请参阅this answer)。

当我去年第一次发布C#去Go时,我写了a blog post来描述我如何把它放在一起。基本上,我使用的是Mono的C#编译器服务版本,我根据Mono for Android配置文件编译。该应用的所有来源也是available on GitHub

这不是一个完美的解决方案,因为当前的实现存在一些问题(其中一些在博客文章中有详细介绍)。目前,由于Mono运行时出现问题,我无法支持在应用程序中创建/编译类。这是一个已记录的问题,已在Mono的更高版本中得到修复,但由于Mono for Android仍然基于Mono 2.10,因此尚未获得这些修复。我的理解是,今年晚些时候Xamarin将开始致力于将Mono for Android(以及MonoTouch)带到Mono 2.12,这也应该带来这些修复,加上框中的C#编译器服务,避免带来它像我一样在一个单独的图书馆里。

答案 1 :(得分:1)

编辑:请参阅Greg Shackles的评论,因为他进一步深入了解过程并纠正了我的误解。

有一个Android应用C# To Go就是这样做的,之前我曾用过它。我不能肯定地说作者是否使用过Mono for Android(不会感到惊讶)。也许您可以联系该应用程序的作者。 然而,据我了解,Mono for Android预先编译DLL并将它们转换为Java或以某种方式将它们连接到Java接口,然后打包/部署。我不知道是否通过平台上运行时的编译器将生成一个可以加载的可用程序集。

除此之外,我知道在运行时发出IL(而不是编译DLL)的伪代码生成器在我使用它们时起作用。特别是,我在Mono for Android上使用FLEE (Fast Lightweight Expression Evaluator)的C#端口。也许这样的事情可以满足你的需求。

最后,调查Mono自己编译的CodeDOM功能。根据我的理解,它有一个更好的运行时代码编译器服务(类似于C#5将带给我们的);也许它也适用于Android的Mono。