最近做了下代码的热修复功能,主要为了修复线上出现的UI模块的bug.下面总结下遇到的问题。
为什么要使用热修复以及为什么选择XLua?
使用热修复是为了紧急修复一些线上bug,同时避免整包更新.选择XLua是因为它的hotfix能方便的接入到纯C#开发的代码中,效率还行.
开发过程中需要注意什么?
我把UI相关的命名空间都加到了配置中,打包过程中会对这些命名空间下的类型进行代码注入。开发过程中的只需要保证命名空间的正确性。
问题分析
- 可以先查看xLua-master\Assets\XLua\Doc的文档(git下载的工程中有)
- 热修复重载函数
public class ClsType
{
public void Test(int a, int b) { Log(a + b);}
public void Test(string a, string b) { Log(a + b);}
public void Test(A a, A b) { Log(“A”);}
public void Test(B a, B b) { Log(“B”)}
}
xlua.hotfix(ClsType, “Method”, function(self, a,b)
if type(a) == “userdata” then
if a:GetType() == CS.A.UnderlyingSystemType then
print(“A hotfix”)
elseif a:GetType() == CS.B.UnderlyingSystemType then
print(“B hotfix”)
end
elseif type(a) == “number” then
print(a + b)
elseif type(a) == “string” then
print(a…b)
end
end)
XLua对于重载函数的修复是所有函数都会走到xlua修复的函数中,所有我的解决办法是对参数类型进行判断,当然对于float和double的重载就分不清了,因为这两个数据类型都对应lua的number。
-
热修复子类函数,子类调用父类
base(self):Func() -
构造函数打补丁
构造函数的热修复不是替换,是执行原有函数后指行修复函数。
xlua.hotfix(CS.COW.UI.TestB, “.ctor”, function(self, a,b)
print(“lua .ctor”)
end) -
泛型函数打补丁
泛型函数只能针对指定类型进行修复
public class Test
{
public void Add(T n1, T n2){Debug.Log(“Add”); }
}
xlua.hotfix(CS.Test(CS.System.Int32), “Add”, function(self, a,b)
print(a + b)
end) -
Lua中调用CS的范型函数
xlua.get_generic_method(className,methodName,index)
获取某个类型的某个范型函数,如果是重载的范型函数,可以使用index。