ET版本:7.2
Unity版本:2021.3.21f1
Net版
本:
问题背景,ET + HybridCLR。
ET 7.2 自带了CodeLoader ,以及重载Hotfix的方法,看Demo , ET将代码编译成了 Model.dll 和 Hotfix.dll ,目前产品须要有个场景,在游戏内动态加载子 dll, 就是我仿照 Model.dll 和 Hotfix.dll 写了个 PhzModel.dll 和 PhzHotfix.dll 。这两个 dll 在程序需要的时候再动态下载和加载。在此背景下,我仿照 CodeLoader 写了个加载的方法。
如图,这里完全仿照Demo写的,主旨就是从AB包中拿出来编译好的 PhzModel.dll 和 PhzHotfix.dll。然后Assembly.Load 加载两个dll,然后 EventSystem.Instance.AddDll ,把这两个dll 中的类型加载到 EventSystem。

接下来,我仿照 EventSystem.Add 写了个 AddDll。如图




目前到这里,都没问题。实测是可以正确加载到dll的类型并添加到 EventSystem 中的,ET System 中的 awake destroy、Event、Invoke等都没问题,但神奇的是。如果我第二次调用加载同样dll的方法,就会类型出错。注意上图第二张图片里红色 log 区域。
初次加载dll 都正常。输出结果

第二次加载 dll 异常。输出结果

神奇的是,第二次加载dll,这里的 iSystemType.Type() 不等于 dll 内 的 type 了。ET.Client.Phz.PhzGameViewComponent 不等于 ET.Client.Phz.PhzGameViewComponent。
我设置了断点,仅仅从debug数据来看 这两个 type 是一样的,name ,fullname, namespace 等都一样。但 == 返回false。
追溯 iSystemType.Type() 方法,发现 return typeof(T); 他只是返回了<T>的类型,但为什么我第二次加载dll后,这里返回的 类型和 PhzModel.dll 内的不一样了。导致第二次进入相同的场景,该场景内的 system 就都失效了 awake 、 detroy 等都不会被正常调用。
值的注意的是,在Demo 中,客户端的 reload ,热重载Hotfix,只重载了 Hotfix.dll 。但本人写的热重载,重新加载了 PhzModel.dll 和 PhzHotfix.dll, 怀疑第二次不应该 重载 PhzModel.dll 。但这无法解释为什么类型无法对应的问题,而且 这是否意味着 游戏内 只能热重载 PhzHotfix.dll ,而如果 PhzModel.dll 有更新,则无法在游戏内动态更新加载?