7.Unity调用ILR对象成员方法

7.Unity调用ILRuntime-方法调用-成员方法调用


7.1 知识点

成员方法调用

成员方法调用概述

成员方法调用和静态方法调用几乎一样,区别在于需要先创建对象,将对象传入之前为null的地方。

  1. 直接通过 appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表) 调用方法。
  2. 通过类似反射的 IMethod 调用方法:
    • 通过 IType 中的 GetMethod 方法,类似反射一样的获取对应类中的方法。
    • 2-1. 通过 appdomain.Invoke(IMethod对象, 类对象, 参数列表)
    • 2-2. 通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性。

给Lesson4_Test添加成员方法并重新生成

public void TestFun()
{
    Debug.Log("无参无返回值 成员方法调用");
}

public int TestFun2(int i)
{
    Debug.Log("有参有返回值 成员方法调用");
    return 10 + i;
}

获取成员方法并调用

ILRuntimeManager.Instance.StartILRuntime(() =>
{
    AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
    // 得到IType,通过它实例化一个指定的热更新工程中的类对象 (Lesson4_Test)
    IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
    object obj = ((ILType)type).Instantiate(); // 实例化Lesson4_Test对象

    
    // 成员方法调用和静态方法调用几乎一样
    // 区别就是需要先创建对象,将对象传入之前为null的地方

    
    // 1. 直接通过appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表)
    appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, null); // 无参无返回值 成员方法调用

    int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun2", obj, 99); // 有参有返回值 成员方法调用
    print(i); // 109

    
    
    // 2. 通过类似反射的IMethod调用方法
    // 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法

    // 得到对应方法的方法信息
    IMethod method1 = type.GetMethod("TestFun", 0);
    IMethod method2 = type.GetMethod("TestFun2", 1);

    
    //  2-1. 通过appdomain.Invoke(IMethod对象, 类对象, 参数列表)
    appDomain.Invoke(method1, obj); // 无参无返回值 成员方法调用
    i = (int)appDomain.Invoke(method2, obj, 88); // 有参有返回值 成员方法调用
    print(i); // 98

    
    
    //  2-2. 通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
    using (var method = appDomain.BeginInvoke(method1))
    {
        method.PushObject(obj);
        method.Invoke(); // 无参无返回值 成员方法调用
    }

    using (var method = appDomain.BeginInvoke(method2))
    {
        method.PushObject(obj);
        method.PushInteger(77);
        method.Invoke(); // 有参有返回值 成员方法调用
        i = method.ReadInteger();
        print(i); // 87
    }
});

总结

成员方法调用和静态方法调用区别在于,需要指明调用方法的对象。

三板斧调用:

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

7.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

        #region 成员方法
        public void TestFun()
        {
            Debug.Log("无参无返回值 成员方法调用");
        }

        public int TestFun2(int i)
        {
            Debug.Log("有参有返回值 成员方法调用");
            return 10 + i;
        }

        #endregion
    }
}

Lesson07_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 Lesson07_Unity调用ILRuntime_方法调用_成员方法调用 : MonoBehaviour
{
    void Start()
    {
        #region 复习 启动ILRuntime 创建类对象

        ILRuntimeManager.Instance.StartILRuntime(() =>
        {
            AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
            //得到IType 通过他实例化一个指定的热更新工程中的类对象 (Lesson4_Test)
            IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
            object obj = ((ILType)type).Instantiate();//实例化Lesson4_Test对象

            
            
            //成员方法调用和静态方法调用几乎一样
            //区别就是需要先创建对象,将对象传入之前为null的地方
            
            
            
            //1.直接通过appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表)
            appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, null);//无参无返回值 成员方法调用

            int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun2", obj, 99);//有参有返回值 成员方法调用
            print(i);//109

            
            
            
            //2.通过类似反射的IMethod调用方法
            //  通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法

            //得到对应方法的方法信息
            IMethod method1 = type.GetMethod("TestFun", 0);
            IMethod method2 = type.GetMethod("TestFun2", 1);

            
            //  2-1.通过appdomain.Invoke(IMethod对象, 类对象, 参数列表)
            appDomain.Invoke(method1, obj);//无参无返回值 成员方法调用
            i = (int)appDomain.Invoke(method2, obj, 88);//有参有返回值 成员方法调用
            print(i);//98

            
            
            //  2-2.通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
            using (var method = appDomain.BeginInvoke(method1))
            {
                method.PushObject(obj);
                method.Invoke();//无参无返回值 成员方法调用
            }

            using (var method = appDomain.BeginInvoke(method2))
            {
                method.PushObject(obj);
                method.PushInteger(77);
                method.Invoke();//有参有返回值 成员方法调用
                i = method.ReadInteger();
                print(i);//87
            }
        });

        #endregion

        #region 知识点 成员方法调用

        //成员方法调用和静态方法调用几乎一样
        //区别就是需要先创建对象,将对象传入之前为null的地方
        //1.直接通过appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表)
        //2.通过类似反射的IMethod调用方法
        //  通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
        //  2-1.通过appdomain.Invoke(IMethod对象, 类对象, 参数列表)
        //  2-2.通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性

        #endregion

        #region 总结

        //三板斧调用(和静态方法调用区别就是,需要指明调用方法的对象)
        //1.appdomain.Invoke("命名空间.类名", "静态方法名", 对象, 参数列表)
        //2.appdomain.Invoke(IMethod对象, 对象, 参数列表)
        //3.无GC Alloc方式 using BeginInvoke push Invoke read -> ubpir方式

        #endregion
    }
}

7.3 练习题

练习一下Unity跨域调用ILRuntime中的成员方法



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

×

喜欢就点赞,疼爱就打赏