1. 程式人生 > >mono嵌入式應用研究(三):註冊內部函式

mono嵌入式應用研究(三):註冊內部函式

說到mono的嵌入式開發,最關鍵的要屬內部函數了,mono通過擴充套件CIL指令集,使c#可以呼叫native端註冊的內部函式,這個也是mono虛擬機器實現的基礎。

內部函式的註冊使用API mono_add_internal_call,具體如下:

mono_add_internal_call("DOSSystem.Logger::InternalLog(uint,string)", (void *)CDOSMainThread::MonoInternalCallLog);
static void MonoInternalCallLog(UINT LogChannel, MonoString * pMsg);

對應c#端:

namespace DOSSystem
{
    public class Logger
    {
        [MethodImplAttribute(MethodImplOptions.InternalCall)]
        extern static void InternalLog(uint LogChannel, string Msg);
    };
};


這是為c#中名稱空間DOSSystem中的類Logger註冊了一個內部函式InternalLog,當在c#中呼叫Logger.InternalLog時就會呼叫MonoInternalCallLog來實現你想要做的事。

註冊時需要傳入函式名和native端的函式指標,必須是靜態函式,函式名包含名稱空間,類名,函式名和引數型別名,函式型別名必須是完整c#型別名稱,如果是類的話需要帶上名稱空間,ref out in型的引數則需要在型別名後面加&標識。

當引數被從c#端傳遞到native端的時候,會依照以下規則轉換:

基礎型別,比如int,float,boolean之類直接轉換成對應c的型別。

字串string,轉換成MonoString *。

物件,轉換成MonoObject *。

返回值也需要按照這個規則來轉換,其實如果有什麼搞不明白的話,可以去看mono原始碼裡的icall-def.h和icall.c,看他對c#系統庫的實現是怎麼做的就明白了。