6.Unity调用ILR对象静态方法

6.Unity调用ILRuntime-方法调用-静态方法调用


6.1 知识点

复习启动ILRuntime

ILRuntimeManager.Instance.StartILRuntime(() =>
{
   
});

静态方法调用

静态方法调用概述

静态方法调用有两种方式:

  1. 直接通过 appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表) 调用静态方法。

  2. 通过类似反射的 IMethod 调用方法:

    • 通过 IType 中的 GetMethod 方法,类似反射一样的获取对应类中的方法。
    • 2-1. 通过 appdomain.Invoke(IMethod对象, null, 参数列表)
    • 2-2. 通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性。
      using (var method = appDomain.BeginInvoke(methodName))
      {
            method.Push.....(1000);//传入指定类型参数
            method.Invoke();//执行方法
            method.Read....()//获取指定类型返回值
      }
      

给Lesson4_Test添加静态方法,并重新生成

public static void TestStaticFun()
{
    Debug.Log("无参静态方法");
}

public static int TestStaticFun2(int i)
{
    Debug.Log("有参静态方法" + i);
    return i + 10;
}

获取静态方法并调用

ILRuntimeManager.Instance.StartILRuntime(() =>
{
    //加载完了热更新相关的dll和pdb后 再去执行热更代码
    //静态方法调用有两种方式

    
    // 1. 直接通过 appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表) 调用静态方法
    AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
    appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun", null, null); //无参静态方法
    int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun2", null, 99); //有参静态方法99
    print(i); //109
    
    
    // 2. 通过类似反射的IMethod调用方法
    // 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
    
    
    //  2-1. 通过appdomain.Invoke(IMethod对象, null, 参数列表)
    //获取对应类 的 Itype
    IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
    //获取对应方法的信息
    IMethod method1 = type.GetMethod("TestStaticFun", 0);
    IMethod method2 = type.GetMethod("TestStaticFun2", 1);
    //通过方法信息 IMethod 调用对应方法
    appDomain.Invoke(method1, null, null); //无参静态方法

    i = (int)appDomain.Invoke(method2, null, 88);//有参静态方法88
    print(i);//98
    
    
    
    //  2-2. 通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
    //    using (var method = appDomain.BeginInvoke(methodName))
    //    {
    //          method.Push.....(1000);//传入指定类型参数
    //          method.Invoke();//执行方法
    //          method.Read....()//获取指定类型返回值
    //    }
    using (var method = appDomain.BeginInvoke(method1))
    {
        method.Invoke();//无参静态方法
    }

    using (var method = appDomain.BeginInvoke(method2))
    {
        method.PushInteger(77);
        method.Invoke();//有参静态方法77
        i = method.ReadInteger();
        print(i);//有参静态方法87
    }
});

总结

静态方法调用的规则和成员属性方法调用规则基本类似,有三种调用方式:

  1. appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
  2. appdomain.Invoke(IMethod对象, null, 参数列表)
  3. 无GC Alloc方式:using BeginInvokepushinvokereadubpir方式。

注意:
建议大家都使用类似反射的 IMethod 来调用方法,并且使用更节约性能的无GC Alloc方式来调用。


6.2 知识点代码

Lesson4_Test

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{
    class Lesson4_Test
    {
        #region 成员变量

        private string str;

        #endregion

        #region 成员属性

        public string Str
        {
            get
            {
                return str;
            }
            set
            {
                str = value;
            }
        }

        #endregion

        #region 构造函数

        public Lesson4_Test()
        {

        }

        public Lesson4_Test(string str)
        {
            this.str = str;
        }

        #endregion

        #region 静态方法

        public static void TestStaticFun()
        {
            Debug.Log("无参静态方法");
        }

        public static int TestStaticFun2(int i)
        {
            Debug.Log("有参静态方法" + i);

            return i + 10;
        }

        #endregion

    }
}

Lesson06_Unity调用ILRuntime_方法调用_静态方法调用

using ILRuntime.CLR.Method;
using ILRuntime.CLR.TypeSystem;
using ILRuntime.Runtime.Enviorment;
using System.Collections;
using System.Collections.Generic;
using BaseFramework;
using UnityEngine;


public class Lesson06_Unity调用ILRuntime_方法调用_静态方法调用 : MonoBehaviour
{
    void Start()
    {
        #region 复习 启动ILRuntime

        ILRuntimeManager.Instance.StartILRuntime(() =>
        {
            //加载完了热更新相关的dll和pdb后 再去执行热更代码
            //静态方法调用有两种方式

            
            // Appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
            //1.直接通过appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
            //  调用静态方法
            AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
            appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun", null, null); //无参静态方法
            int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun2", null, 99); //有参静态方法99
            print(i); //109
            
            
            //2.通过类似反射的IMethod调用方法
            //  通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
            
            
            //  2-1.通过appdomain.Invoke(IMethod对象, null, 参数列表)
            //获取对应类 的 Itype
            IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
            //获取对应方法的信息
            IMethod method1 = type.GetMethod("TestStaticFun", 0);
            IMethod method2 = type.GetMethod("TestStaticFun2", 1);
            //通过方法信息 IMethod 调用对应方法
            appDomain.Invoke(method1, null, null); //无参静态方法

            i = (int)appDomain.Invoke(method2, null, 88);//有参静态方法88
            print(i);//98

            
            
            //  2-2.通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
            //    using (var method = appDomain.BeginInvoke(methodName))
            //    {
            //          method.Push.....(1000);//传入指定类型参数
            //          method.Invoke();//执行方法
            //          method.Read....()//获取指定类型返回值
            //    }
            using (var method = appDomain.BeginInvoke(method1))
            {
                method.Invoke();//无参静态方法
            }

            using (var method = appDomain.BeginInvoke(method2))
            {
                method.PushInteger(77);
                method.Invoke();//有参静态方法77
                i = method.ReadInteger();
                print(i);//有参静态方法87
            }
        });

        #endregion

        #region 知识点 静态方法调用

        //静态方法调用有两种方式
        //1.直接通过appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
        //  调用静态方法

        //2.通过类似反射的IMethod调用方法
        //  通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
        //  2-1.通过appdomain.Invoke(IMethod对象, null, 参数列表)
        //  2-2.通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
        //    using (var method = appDomain.BeginInvoke(methodName))
        //    {
        //          method.Push.....(1000);//传入指定类型参数
        //          method.Invoke();//执行方法
        //          method.Read....()//获取指定类型返回值
        //    }

        #endregion

        #region 总结

        //静态方法调用的规则和成员属性方法调用规则基本类似
        //三板斧调用
        //1.appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
        //2.appdomain.Invoke(IMethod对象, null, 参数列表)
        //3.无GC Alloc方式 using BeginInvoke push Invoke read -> ubpir方式

        //注意:
        //建议大家都使用类似反射的IMethod来调用方法
        //并且使用更节约性能的无GC Alloc方式来调用

        #endregion
    }
}

6.3 练习题

请基于本节课,自己练习一下Unity跨域调用ILRuntime中的静态方法



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏