ILRuntime中实现OSA
什么是ILRuntime?
ILRuntime项⽬为基于C#的平台(例如Unity)提供了⼀个 纯 C# 实现 , 快速 、 ⽅便 且 可靠 的IL 运⾏时,使得能够在不⽀持JIT的硬件环境(如iOS)能够实现代码的热更新。具体可以学习: http://http s://ourpalm.github.io/ILRuntime/public/v1/guide/index.html ,本文不再赘述。
代码实现
OSABaseAdapter
using System;
using ILRuntime.Runtime.Enviorment;
using ILRuntime.Runtime.Intepreter;
using ILRuntime.CLR.Method;
using Com.TheFallenGames.OSA.Core;
public class OSABaseAdapter : CrossBindingAdaptor
{public override Type BaseCLRType{get{return typeof(Com.TheFallenGames.OSA.Core.OSA<Com.TheFallenGames.OSA.CustomParams.BaseParamsWithPrefab, Com.TheFallenGames.OSA.Core.BaseItemViewsHolder>);}}public override Type AdaptorType{get{return typeof(Adaptor);}}public override object CreateCLRInstance(ILRuntime.Runtime.Enviorment.AppDomain appdomain, ILTypeInstance instance){return new Adaptor(appdomain, instance);}//为了完整实现MonoBehaviour的所有特性,这个Adapter还得扩展,这⾥只抛砖引⽟,只实现了最常⽤的Awake, Start和Updatepublic class Adaptor : Com.TheFallenGames.OSA.Core.OSA<Com.TheFallenGames.OSA.CustomParams.BaseParamsWithPrefab, Com.TheFallenGames.OSA.Core.BaseItemViewsHolder>, CrossBindingAdaptorType{ILTypeInstance instance;ILRuntime.Runtime.Enviorment.AppDomain appdomain;public Adaptor(){}public Adaptor(ILRuntime.Runtime.Enviorment.AppDomain appdomain, ILTypeInstance instance){this.appdomain = appdomain;this.instance = instance;Start();}public ILTypeInstance ILInstance{get { return instance; }set{instance = value;}}public ILRuntime.Runtime.Enviorment.AppDomain AppDomain{get{return appdomain;}set { appdomain = value; }}IMethod mStart;bool mStartGot;protected override void Start(){base.Start();}IMethod mInitData;bool mInitDataGot;public void InitData(){if (!mInitDataGot){mInitData = instance.Type.GetMethod("InitData", 0);mInitDataGot = true;}if (mInitData != null){appdomain.Invoke(mInitData, instance, null);}}IMethod mCreateViewsHolder;bool mCreateViewsHolderGot;protected override BaseItemViewsHolder CreateViewsHolder(int itemIndex){if (!mCreateViewsHolderGot){mCreateViewsHolder = instance.Type.GetMethod("CreateViewsHolder", 1);mCreateViewsHolderGot