ILRuntime學習(之三)

        第三個例子講解是繼承的問題。Hotfix_Projiect工程中的類繼承了TestClassBase,而該類是定義在Unity主工程中的。例子還特意做了註解:Hotfix_Projict中的類只允許繼承有1個Unity主工程的類或者接口,但是可以有隨便多少個熱更DLL中的接口

       使用Instantiate()方法創建熱更工程中的類。由於該類是子類,所以使用了重載方法Instantiate<T>(string type, object[] args = null),該方法返回T類的對象。T類型就是要創建的子類所繼承的父類。當然,這樣直接創建是不可以的,因爲這已經屬於跨域創建了,所以必須要註冊適配器。我們使用AppDomain.RegisterCrossBindingAdaptor(CrossBindingAdaptor adaptor)方法類註冊跨域繼承的類。這裏的參數我們可以直接new一個InheritanceAdapter對象即可。這樣就可以創建實例了。

       例子還使用了另一個方法來創建實例對象,使用Invoke來創建實例。Invoke方法會返回一個object對象,將其轉換成指定的類型即可。但是該方法需要做一個特殊的處理,即Invoke調用的方法要返回需要創建的實例纔可以。同樣,使用這種方法,也是需要註冊適配器的。

       關於InheritanceAdapter類,這個是做適配器用到的類,應該是對應生成的註冊類。該類必須要繼承CrossBindingAdaptor類。類中重寫了父類的三個方法,BaseCLRType方法,返回要繼承的類。AdaptorType方法返回一個真正的適配器對象類型。CreateCLRInstance方法則是返回了一個適配器實例。

        而真正的適配器對象Adaptor需要繼承你想繼承的那個類,並且實現CrossBindingAdaptorType接口。在Adaptor中,需要你重寫所有你希望在熱更腳本里面重寫的方法,並且將控制權轉到腳本里去。例子中還提到一點:對於虛函數而言,必須設定一個標識位來確定是否當前已經在調用中,否則如果腳本類中調用就會造成無限循環,最終導致爆棧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章