如何防止在 Unity3d IL2CPP 中剥离托管 dll
how to prevent stripping of managed dlls in Unity3d IL2CPP
我正在使用 System.Text.Encoding
的 1252 编码来扩展 ASCII 支持以充分利用字节的第 8 位,到目前为止,当使用 Mono 作为 Scripting Backend
时,我将能够防止通过 Assets/link.xml
文件剥离代码,如下所示:
<assembly fullname="I18N">
<type fullname="I18N.Common" preserve="all"/>
<type fullname="I18N.Common.ByteEncoding" preserve="all"/>
<type fullname="I18N.Common.Handlers" preserve="all"/>
<type fullname="I18N.Common.Manager" preserve="all"/>
<type fullname="I18N.Common.MonoEncoder" preserve="all"/>
<type fullname="I18N.Common.MonoEncoding" preserve="all"/>
<type fullname="I18N.Common.Strings" preserve="all"/>
</assembly>
<assembly fullname="I18N.West">
<type fullname="I18N.West" preserve="all"/>
<type fullname="I18N.West.ENCwindows_1252" preserve="all"/>
<type fullname="I18N.West.CP1252" preserve="all"/>
</assembly>
但是,当我切换到 IL2CPP 时,我遇到了崩溃,因为一些功能在构建过程中被剥离了。即使我在 Unity 的播放器设置中禁用了 Stripping Level
..
这是我的运行时崩溃日志:
IL2CPP 崩溃:
NotSupportedException: CodePage 1252 not supported
at System.Security.Cryptography.TripleDESCryptoServiceProvider.CreateEncryptor (System.Byte[] rgbKey, System.Byte[] rgbIV) [0x00000] in <filename unknown>:0
at System.Text.Encoding.GetEncoding (Int32 codepage) [0x00000] in <filename unknown>:0
这与 Mono 相同,当我删除 link.xml 中的 preserve
语句时:
NotSupportedException: CodePage 1252 not supported
at System.Text.Encoding.GetEncoding (Int32 codepage) [0x00000] in <filename unknown>:0
下面是我如何使用违规代码:
byte[] bytes = System.Text.Encoding.GetEncoding(1252).GetBytes(str); // exactly 8-bit
string str = System.Text.Encoding.GetEncoding(1252).GetString(bytes);
非常感谢您!
实际上,您可能在 IL2CPP 运行时看到了一个与代码剥离完全无关的错误。使用 4.6.4p3 版本的 Unity,我可以看到同样的问题,我已经找到了。我们应该能够在下一个补丁版本中修复此问题。
事实证明,libil2cpp 运行时中的 icall 错误地与 mscorlib 中的托管代码交互,因此 mscorlib 中的代码被发送到 IL2CPP 脚本后端的不同路径。
我正在使用 System.Text.Encoding
的 1252 编码来扩展 ASCII 支持以充分利用字节的第 8 位,到目前为止,当使用 Mono 作为 Scripting Backend
时,我将能够防止通过 Assets/link.xml
文件剥离代码,如下所示:
<assembly fullname="I18N">
<type fullname="I18N.Common" preserve="all"/>
<type fullname="I18N.Common.ByteEncoding" preserve="all"/>
<type fullname="I18N.Common.Handlers" preserve="all"/>
<type fullname="I18N.Common.Manager" preserve="all"/>
<type fullname="I18N.Common.MonoEncoder" preserve="all"/>
<type fullname="I18N.Common.MonoEncoding" preserve="all"/>
<type fullname="I18N.Common.Strings" preserve="all"/>
</assembly>
<assembly fullname="I18N.West">
<type fullname="I18N.West" preserve="all"/>
<type fullname="I18N.West.ENCwindows_1252" preserve="all"/>
<type fullname="I18N.West.CP1252" preserve="all"/>
</assembly>
但是,当我切换到 IL2CPP 时,我遇到了崩溃,因为一些功能在构建过程中被剥离了。即使我在 Unity 的播放器设置中禁用了 Stripping Level
..
这是我的运行时崩溃日志:
IL2CPP 崩溃:
NotSupportedException: CodePage 1252 not supported
at System.Security.Cryptography.TripleDESCryptoServiceProvider.CreateEncryptor (System.Byte[] rgbKey, System.Byte[] rgbIV) [0x00000] in <filename unknown>:0
at System.Text.Encoding.GetEncoding (Int32 codepage) [0x00000] in <filename unknown>:0
这与 Mono 相同,当我删除 link.xml 中的 preserve
语句时:
NotSupportedException: CodePage 1252 not supported
at System.Text.Encoding.GetEncoding (Int32 codepage) [0x00000] in <filename unknown>:0
下面是我如何使用违规代码:
byte[] bytes = System.Text.Encoding.GetEncoding(1252).GetBytes(str); // exactly 8-bit
string str = System.Text.Encoding.GetEncoding(1252).GetString(bytes);
非常感谢您!
实际上,您可能在 IL2CPP 运行时看到了一个与代码剥离完全无关的错误。使用 4.6.4p3 版本的 Unity,我可以看到同样的问题,我已经找到了。我们应该能够在下一个补丁版本中修复此问题。
事实证明,libil2cpp 运行时中的 icall 错误地与 mscorlib 中的托管代码交互,因此 mscorlib 中的代码被发送到 IL2CPP 脚本后端的不同路径。