mono嵌入式應用研究(三):註冊內部函式
阿新 • • 發佈:2019-01-30
說到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#系統庫的實現是怎麼做的就明白了。