可以使用 monodroid 在 Android 设备上编译 C# 代码吗?我想在我的 Android 平板电脑上运行 C# 代码,monodroid 看起来像是可能的解决方案,但我没有发现任何通知,如果 monodroid 编译器只能在 windows/mac 或 Android 上运行。
2 回答
我最初打算将此作为对 Chris Sinclair 答案的评论发布,但我认为它最终会持续很长时间,以至于它也可能是一个单独的答案。
我写了 C# to Go,所以我可以在那里提供一些评论。它实际上是使用 Mono for Android 编写的。但是,说 Mono for Android 将 C# 转换或编译为 Java 是不正确的。应用程序中的 C# 代码在 Mono 运行时之上运行,并且可调用接口用于在运行时之间来回通信(有关详细信息,请参阅此答案)。
当我去年第一次发布 C# to Go 时,我写了一篇博客文章来描述我是如何将它组合在一起的。基本上,我使用的是针对 Mono for Android 配置文件编译的 Mono 的 C# 编译器服务版本。该应用程序的所有源代码也可以在 GitHub 上找到。
这不是一个完美的解决方案,因为当前的实现存在一些问题(其中一些在博客文章中有详细说明)。目前,由于 Mono 运行时出现问题,我无法支持在应用程序中创建/编译类。这是一个记录在案的问题,已在更高版本的 Mono 中修复,但由于 Mono for Android 仍然基于 Mono 2.10,因此尚未得到这些修复。我的理解是,今年晚些时候 Xamarin 将开始致力于将 Mono for Android(以及 MonoTouch)升级到 Mono 2.12,这也应该带来这些修复,加上盒子里的 C# 编译器服务,避免需要带来它像我一样作为一个单独的库。
编辑:请参阅 Greg Shackles 的评论,因为他进一步了解该过程并纠正了我的误解。
有一个 Android 应用程序C# To Go正是这样做的,我以前用过它。我不能确定作者是否使用 Mono for Android(不会感到惊讶)。也许您可以联系该应用程序的作者。但是,据我了解,Android 的 Mono 会预编译 DLL 并将它们转换为 Java,或者在打包/部署之前以某种方式将它们连接到 Java 接口中。我不知道在平台上运行时通过编译器生成程序集是否会产生一个可以加载的开箱即用的可用程序集。
除此之外,我知道在运行时发出 IL(而不是编译 DLL)的伪代码生成器在我使用它们时工作。特别是,我在 Mono for Android 上使用了FLEE(快速轻量级表达式评估器)的 C# 端口。也许这样的东西足以满足您的需求。
最后,研究 Mono 自己的编译 CodeDOM 功能。据我了解,它具有更好的运行时代码编译器服务(类似于 C# 5 将带给我们的);也许它也适用于 Mono for Android。