2012-09-14 78 views
2

可以使用monodroid編譯Android設備上的C#代碼嗎? 我想在我的Android平板電腦上運行C#代碼,monodroid看起來像是可能的解決方案,但是如果monodroid編譯器只能在Windows/Mac或Android上運行,我沒有發現任何提示。即時編譯C#

回答

7

我本來打算張貼此作爲克里斯·辛克萊的答案評論,但想通這是要結束了足夠長的時間,它也可以被一個單獨的答案。

我寫C#去了,所以我可以提供一些評論那裏。它實際上是使用Mono for Android編寫的。然而,說Mono for Android做了從C#到Java的轉換或編譯是不正確的。應用程序中的C#代碼運行在Mono運行時間之上,可調用接口用於在運行時間之間來回交談(有關更多詳細信息,請參見this answer)。

回來時,我第一次發佈C#去年常去我寫了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

編輯:見格雷格鐐銬的意見,他進一步進入處理和糾正我的誤解。

有一個Android應用程序C# To Go它確實和我以前使用它。我不能肯定地說,如果作者使用Mono for Android(不會感到驚訝)。也許你可以聯繫該應用的作者。 然而,據我所知,Android的Mono預先編譯DLL並將它們轉換成Java或以某種方式在打包/部署之前將它們連接到Java接口。我不知道是否在平臺上的運行時通過編譯器生成程序集會生成可加載的可用程序集。

除此之外,我還知道,在運行時發出IL(而不是編譯DLL)的僞代碼生成器的工作,因爲我使用它們。特別是,我在Mono上爲Android安裝了一個C#端口FLEE (Fast Lightweight Expression Evaluator)。也許這樣的東西可以滿足您的需求。

最後,調查Mono自己的編譯CodeDOM功能。據我所知,它具有更好的運行時代碼編譯器服務(類似於C#5將帶給我們的);也許它也適用於Android的Mono。

+1

Mono for Android不會將C#預編譯爲Java,因此該部分不正確。我是C#to Go的作者,所以我剛剛發佈了一個答案,以便對應用程序進行一些深入的瞭解。 –

+0

感謝@GregShackles的洞察力,以及C#To Go的出色工作! –