我正在使用 Unity3D 开发应用程序。
我将我自己的实用程序 DLL 与一些类一起使用。
我已经工作了几个月了,并且毫无问题地进行了很多构建/编译。
上周向 DLL 添加了一个新类,它在我的 PC 中运行良好,但当我构建该项目并在我的 Android 设备中使用它时,它停止运行。 Android Monitor 程序向我显示该错误:
“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”
Newtonsoft 可以找到构造函数的类型是我最近添加的新类。
重要的:所有其他类都被反序列化,没有错误。
新班级唯一不同的想法是名称空间和type。变量、方法和构造函数仍然相同。
同样重要的是,该项目在 PC 上运行良好,该问题仅出现在 Android 中。
我知道我可以在我的班级中做一些自定义反序列化器或添加标签等。但问题是,只有该类会导致问题,并且没有理由更改 JSon 反序列化系统。
谢谢。
背景:这是一个常见问题,其根源在于 UnityLinker 的字节码剥离算法。发生的情况是 UnityLinker 无法看到类型构造函数的任何使用(因为 Newtonsoft.Json 仅通过反射使用它,编译器无法预见),因此它将删除它。仅当使用 IL2CPP 脚本后端构建时才会激活此字节码剥离,这就是为什么您在 PC(或任何其他仅使用 Mono 的计算机)上构建时没有遇到任何问题的原因。
The fix:为了克服这个问题,您可以禁用该类型(甚至只是该构造函数)的字节码剥离。您可以使用link.xml
文件。例子:
<linker>
<assembly fullname="MyAssembly">
<type fullname="MyAssembly.MyCSharpClass">
<!-- disables stripping just for the constructor -->
<method signature="System.Void .ctor()"/>
</type>
<!-- disables stripping for the entire type -->
<type fullname="MyAssembly.MyCSharpClass" preserve="all" />
</assembly>
</linker>
我写了一些关于使用的有用页面link.xml
在处理 AOT 问题的其他工具中,我发现 Unity 的文档缺乏且分散:https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-link.xml
要了解更多关于为什么会这样的信息,请参阅我的解释页面:https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/What-even-is-AOT
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)