709
技術社區[雲棲]
麵向Android上Dalvik運行時的C# 編譯器dot42簡介
Mono for Android最大的缺點是需要在Mono上麵構建,這與Android預期的運行時完全不同。盡管能夠直接訪問完整的CLR的確有些優勢,但是它與Android的Dalvik 運行時之間的封送調用(marshalling call)可能非常昂貴。那為什麼不跳過IL代碼直接生成Dex代碼呢?
事實上這有點誇張。dot42編譯器實際上並沒有跳過IL。恰恰相反,它讀取IL代碼並將其轉換為一種叫做RL或Register Language的新語言。IL和RL主要的差異在於IL是基於棧的(有點像Java的字節碼),而RL基於寄存器。在轉換為RL後,會執行一係列的優化,而且最終產品會被重新編譯。最後的編譯為我們生成Android上Dalvik運行時的dex代碼。
.Net原始調試信息在該過程的每個步驟中都會維護,當然它必須從Windows/.NET PDB格式轉換為dex的調試信息格式。dot42使用Android調試橋接器來連接Visual Studio調試工具。
Android庫可以通過直接引用JAR文件來訪問。“編譯後,調用會被重定向為對原始Android庫的調用。”類型間的某些映射是必須的,但這主要由編譯器解決。例如,java.lang.Boolean被映射為C#的Nullable。
因為dot42生成的是dex代碼,所以有些C#特性無法使用。其中最值得注意的是用戶定義值類型,也就是struct,因為Dalvik中並不存在,所以根本沒法映射。
在使用dot42時,往往需要決定選擇常見數據結構的C#版本還是Android版本。例如,應該使用.Net的List還是Java的ArrayList?據Ewout Prangsma介紹,如果關注內存和下載大小,開發者應該首選Java版本。即使他們的List實現基本上是對ArrayList的很薄的包裝,有些額外的代碼仍然需要打包並傳到手機上去。
dot42是商業產品,正常批量許可是每開發者499歐元起。
最後更新:2017-04-03 22:31:03