unity的UnityEngine.dll中extern非static函數是什麼原理??

上面截圖來自UnityEngine.dll 的 Assetbundle類中的一個函數聲明

請問個問題,正常extern的函數都是static的,但在unity的UnityEngine.dll中extern非static函數是什麼原理??還有請問下 [WrapperlessIcall, TypeInferenceRule(TypeInferenceRules.TypeReferencedBySecondArgument)]、[MethodImpl(MethodImplOptions.InternalCall)] 這些屬性分別表示什麼意思的?


Unity大部分功能都是C++實現的,C#的API只是一個wrapper。InternalCall表示這個函數的實現由runtime提供。

自己host mono runtime的話可以通過mono_add_internal_call把native實現注入進去。具體參考 http://www.mono-project.com/docs/advanced/embedding/

所以調用這些函數其實就是調用Unity的native API,代碼是不會讓你看到的。但是沒有Unity源碼又想搞清楚裡面在幹什麼怎麼辦呢?其實有大招。

不知道為什麼,Windows版的Unity附帶了全套native代碼的pdb,而且是private的,在安裝目錄就能找到。這樣自己建一個Symbol Store,然後掛上WinDbg就可以開心地調試Unity的內部結構了。


我最近也在研究Mono,似乎可以回答一下這個問題的一部分。

在Mono的C#代碼中被標記了[MethodImpl(MethodImplOptions.InternalCall)]的函數的實現部分是在C++中的,需要使用mono_add_internal_call來添加C#函數和C++函數的對應關係,C++中的函數需要是static或者全局函數,但是C#中的函數並沒有要求一定要static,我自己試了一下,非static函數會有一個默認參數,這個參數是MonoObject* 類型的,傳遞的應該是這個C#類的this引用,顯式聲明的參數都會在這個參數後面被傳遞,static函數就不會有這個默認的參數,個人覺得這個類似於lua中調用函數使用點還是冒號的區別。更多的東西我也還沒有看到,回答的不對的地方還望指正,希望對題主有所幫助!


推薦閱讀:

C#的這個語法是在哪一個版本出現的?
為什麼 C# 應用這麼少?
如何進一步提升自己的能力?
C#初學者怎樣系統高效地用MSDN?
做坦克射擊的遊戲,怎麼樣能讓AI打的不那麼准?

TAG:Unity遊戲引擎 | C# |