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);
        }
    }
    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和Update
    public class Adaptor : Com.TheFallenGames.OSA.Core.OSA, 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

你可能感兴趣的:(Unity,实例,unity,c#)