ILRuntime學習(之二)

         第三個例子講解是使用委託。使用dll內部的委託是不需要做處理的,可以直接使用。但是,如果dll中使用的委託是定義在UnityEngine等unity命名空間下的,則需要做一些註冊處理。

        HotFix_Project工程中使用了三個定義在例子中的委託,這些委託在unity工程中是沒有辦法讀取到的。爲此,我們需要給這些委託註冊適配器。對於同一個參數組合的委託,只需要註冊一次即可ILRuntime內部是使用Action,以及Func這兩個系統自帶委託類型來生成的委託實例,所以如果你需要將一個不是Action或者Func類型的委託實例傳到ILRuntime外部使用的話,除了委託適配器,還需要額外寫一個轉換器,將Action和Func轉換成你真正需要的那個委託類型

       對於無返回值的委託,使用AppDomain.DelegateManager.RegisterMethodDelegate<T>()來進行註冊,帶有返回值的委託則是使用AppDomain.DelegateManager.RegisterFunctionDelegate<T, R>()來註冊。

      轉換器的目的是把Action或者Func轉換成正確的類型。使用AppDomain.RegisterDelegateConvertor<T>(Func<Delegate, Delegate> action)方法來轉換類型。如圖:

如圖:

其中T類型就是委託類型。參數是一個Func<Delegate, Delegate>類型的委託。這裏使用的是Lambda表達式來寫的委託。action是參數。返回一個action類型的委託,調用的參數是a。方法體內部有兩個嵌套的返回,這倆個返回必須類型一致,即,有第一個委託有返回值,則第一個委託必須是Func委託。

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