- Type.IsSZArray没有找到
- Dictionary的部分构造方法报错
- 解决办法:
给xLua生成代码的配置文件(xLua里默认是叫ExampleConfig的文件)加入对应的黑名单,使用BlackList的特性。IsSZArray是属性,可以直接使用官方的方法。Dictionary那个是泛型而且是构造方法,比较复杂。具体参考下面的写法。
//黑名单
[BlackList]
public static List<List<string>> BlackList = new List<List<string>>() {
new List<string>(){"System.Type","IsSZArray"},
};
#if UNITY_2018_1_OR_NEWER
[BlackList]
public static Func<MemberInfo, bool> MethodFilter = (memberInfo) =>
{
if (memberInfo.DeclaringType.IsGenericType && memberInfo.DeclaringType.GetGenericTypeDefinition() == typeof(Dictionary<,>))
{
if (memberInfo.MemberType == MemberTypes.Constructor)
{
ConstructorInfo constructorInfo = memberInfo as ConstructorInfo;
var parameterInfos = constructorInfo.GetParameters();
if (parameterInfos.Length > 0)
{
if (typeof(System.Collections.IEnumerable).IsAssignableFrom(parameterInfos[0].ParameterType))
{
return true;
}
}
}
else if (memberInfo.MemberType == MemberTypes.Method)
{
var methodInfo = memberInfo as MethodInfo;
if (methodInfo.Name == "TryAdd" || methodInfo.Name == "Remove" && methodInfo.GetParameters().Length == 2)
{
return true;
}
}
}
return false;
};
#endif
-
原因分析
- 这个Bug其实在xLua的FAQ文档里有提过,文档说的是运行和编译的使用的系统库mscorlib.dll版本不一致。具体来说就是xLua在生成wrap代码时会拿反射一个类里面的方法和属性,这个时候就出现了某个类的方法或属性我可以反射出来,但是编译器不认这个方法,比如Type.IsSZArray,就是这种情况,我试过在unity2017是没有问题。所以归根到底还是那句话。
垃圾Untiy