Unity WebGL - 定位触发代码 Reflection.emit
Unity WebGL - Locating code that triggers Reflection.emit
我 运行 在我的网络播放器构建中遇到了可怕的 Reflection.emit 问题,但无法找到触发它的原因。我目前正在逐个方法注释掉代码并重建以找到原因并将其缩小到以下范围。
我没有使用 JSON,所以各种 JSON 库不是原因,也不是 google 返回的任何其他结果建议。
我怎样才能更容易地找到这个错误的原因。我有完整的堆栈跟踪和完整的调试,但我得到的只是以下控制台输出。
NotSupportedException: C:\Program Files\Unity 2018.2.0b2\Editor\Data\il2cpp\libil2cpp\icalls\mscorlib\System.Reflection.Emit\AssemblyBuilder.cpp(20) : Unsupported internal call for IL2CPP:AssemblyBuilder::basic_init - System.Reflection.Emit is not supported.
Rethrow as TypeInitializationException: The type initializer for 'System.Reflection.Emit.DynamicMethod.AnonHostModuleHolder' threw an exception.
//NOTE: appM.procM is a C# .Net 4.x dynamic variable EG:
//public dynamic procM = GetProcClass(strProcName)
public void ShowProcList() {
/* Rest of method commented out*/
if(appM.procM == null){
procList.Initialize(appM.procM.lstNames, this);
}
/* Rest of method commented out*/
}
public void Initialize(List<string> lstNames, UIM um, string currProc=null) {
uiM = um;
//cleanup of the list before populating
foreach(Transform fld in Panel.transform) {
Destroy(fld.gameObject);
}
/* Rest of method commented out*/
}
更新: 我缩小了问题代码行的范围,但还没有关闭问题,因为必须有比逐行注释掉和重建更简单的方法。
对于未来的搜索者,问题是 if(appM.procM == null) 检查。由于 procM 是一个动态变量反射,因此使用它可以在 webGL 构建中杀死 AOT。没有生成编译器警告来保护自己。
没关系,我是个白痴,Player Settings 下的 Enable Exceptions 选项设置为 Full Without Stacktrace 而不是 Full with Stacktrace .
值 Full With Stacktrace 包含相关数据。在浏览器控制台中很容易找到。警告完全调试确实会增加构建时间并降低应用程序速度。
我 运行 在我的网络播放器构建中遇到了可怕的 Reflection.emit 问题,但无法找到触发它的原因。我目前正在逐个方法注释掉代码并重建以找到原因并将其缩小到以下范围。
我没有使用 JSON,所以各种 JSON 库不是原因,也不是 google 返回的任何其他结果建议。
我怎样才能更容易地找到这个错误的原因。我有完整的堆栈跟踪和完整的调试,但我得到的只是以下控制台输出。
NotSupportedException: C:\Program Files\Unity 2018.2.0b2\Editor\Data\il2cpp\libil2cpp\icalls\mscorlib\System.Reflection.Emit\AssemblyBuilder.cpp(20) : Unsupported internal call for IL2CPP:AssemblyBuilder::basic_init - System.Reflection.Emit is not supported.
Rethrow as TypeInitializationException: The type initializer for 'System.Reflection.Emit.DynamicMethod.AnonHostModuleHolder' threw an exception.
//NOTE: appM.procM is a C# .Net 4.x dynamic variable EG:
//public dynamic procM = GetProcClass(strProcName)
public void ShowProcList() {
/* Rest of method commented out*/
if(appM.procM == null){
procList.Initialize(appM.procM.lstNames, this);
}
/* Rest of method commented out*/
}
public void Initialize(List<string> lstNames, UIM um, string currProc=null) {
uiM = um;
//cleanup of the list before populating
foreach(Transform fld in Panel.transform) {
Destroy(fld.gameObject);
}
/* Rest of method commented out*/
}
更新: 我缩小了问题代码行的范围,但还没有关闭问题,因为必须有比逐行注释掉和重建更简单的方法。
对于未来的搜索者,问题是 if(appM.procM == null) 检查。由于 procM 是一个动态变量反射,因此使用它可以在 webGL 构建中杀死 AOT。没有生成编译器警告来保护自己。
没关系,我是个白痴,Player Settings 下的 Enable Exceptions 选项设置为 Full Without Stacktrace 而不是 Full with Stacktrace .
值 Full With Stacktrace 包含相关数据。在浏览器控制台中很容易找到。警告完全调试确实会增加构建时间并降低应用程序速度。