ET框架ILRuntime使用注意点

使用版本

ET版本用的4.0分支带FairyGUI组件
ILRuntime:合并的master分支上的新版本
Unity版本2017.4.15f1

新版本注意事项

  1. 更新ILRuntime后,Assembly的stream不能关闭,所以要改掉using的用法
    //旧代码
    using (MemoryStream fs = new MemoryStream(assBytes))
    using (MemoryStream p = new MemoryStream(mdbBytes))
    {
        this.appDomain.LoadAssembly(fs, p, new Mono.Cecil.Pdb.PdbReaderProvider());
    }

    //新代码
    this.dllStream = new MemoryStream(assBytes);
    this.pdbStream = new MemoryStream(pdbBytes);
    this.appDomain.LoadAssembly(this.dllStream, this.pdbStream, new Mono.Cecil.Pdb.PdbReaderProvider());
  1. 更新ILRuntime后,Enum的等值对比有问题,把ConfigAttribute中的枚举类型改成int类型,配置文件的Attribute也要做相应修改
    //旧代码
    [Config(AppType.ClientH | AppType.ClientM)]
    public class ExperiencerConfigCategory : ACategory
    {
    }

    //新代码
    [Config((int)(AppType.ClientH | AppType.ClientM))]
    public class ExperiencerConfigCategory : ACategory
    {
    }

IOS真机注意事项

下面的问题都是iltocpp后在IOS真机出现的,一般表现为nullchek崩溃,而pc版(开了ILRuntime)正常。

  1. 传delegate回调给主工程Model.dll时,不要使用带额外参数的嵌套lambda表达式
    比如在Model.dll里面定义了一个参数为JsonData的回调SendRequest,在Hotfix.dll里面直接传callback函数进去没有问题:
    ETModel.HttpModule.Instance.SendRequest(
        proto.GetUrlHead(),
        proto.GetProtocolStr(),
        proto.GetRequestType(),
        ReadMainCallback
    );

    private void ReadMainCallback(JsonData data) { }

但是如果想加参数,写成类似下面这种:

    ETModel.HttpModule.Instance.SendRequest(
        proto.GetUrlHead(),
        proto.GetProtocolStr(),
        proto.GetRequestType(),
        (data) =>
        {
            ReadMainCallback(data, otherparams);
            // bla bla bla
        }
    );

    private void ReadMainCallback(JsonData data, otherparams...etc) { }

则回调中如果出现New或者Activator.CreateInstance Hotfix.dll内部的类时,真机会报nullchek崩溃

  1. ET框架内部各个模块之间大部分情况下是通过Event事件来通信,不过在Hotfix.dll里面要注意尽量不要嵌套Hotfix层的事件。比如事件A触发函数里面又触发了事件B,则在事件B的触发函数里面,在GetComponent取组件的时候,有一定几率在真机上报nullchek崩溃。

  2. 不要在Hotfix.dll的类里面加两个或者两个以上的Attribute,我想在ConfigCatogery的定义里面加一个额外的Attribute,结果真机上Activator.CreateInstance创建这个类的时候会报nullchek崩溃,类似这样:

    [Config((int)(AppType.ClientH | AppType.ClientM))]
    [ABConfig(ABConfigName.Exp)]
    public class ExperiencerConfigCategory : ACategory
    {
    }

我想给某个配置文件单独定义在一个AB里面(都放在config.unity3d里面说实话加载不是很灵活),一开始想法是再加一个Attribute定义ab的名字,在Model.dll下没问题,但是IOS真机上就会崩溃。

  1. 不要定义Model.dll和Hotfix.dll都监听的事件
    如果一个事件A在热更层和主工程都监听了,那在IOS真机上,触发完一层的函数到另外一层时,很可能会报nullchek崩溃。

  2. 在热更Hotfix.dll中,Component如果注册了Update(可能还包含Awake等其他的,没有测试)函数,则在Update中不要触发Hotfix层的事件,和第一点类似,在运行到new或者Activator.CreateInstance会报nullchek崩溃,无法创建Hotfix内部的类。

  3. 不要使在热更层用System.Linq
    有时候为了方便处理集合,用了一些Linq里的方法,比如First()之类的,但是在ios上iltocpp之后会抛出一些pc版或者android没有的异常。

其他的一些还没遇到的坑会不定时更新。

你可能感兴趣的:(ET框架ILRuntime使用注意点)