以下默认使用 Windows 操作系统打包构建,不使用多线程,不开启 AOT。
package.nw/package.json 添加:
完成后需要重启电脑
如果项目较大,开发者工具崩溃,请增加开发者工具内存限制
WeChatWASM.WebMD5.GetMD5Bytes(buffer),以下为示例代码:
WeChatWASM.WebAES,但我们仍然推荐不要在客户端使用对称加密/解密。BinaryFormatter 未实现
LitJson.JsonMapper.ToJson 这个接口序列化后会把 int 转为 string,导致后续反序列化无法区分类型,推荐使用 Newtonsoft.Json。16.4 (未确定具体小版本) 无法正确解析 Wasm 的情况, 这是 iOS 本身的兼容性问题。
WeixinMiniGameSupport\BuildTools\DotNetWithWasm-win-x64\packsMicrosoft.NET.Runtime.Emscripten.3.1.34.Cache.win-x64\8.0.0\tools\emscripten\cache\sysroot\lib\wasm32-emscripten ,可执行文件为 wasm-ld、wasm-opt 等, 错误为 __undefined symbol: __[some_cpp_mangled_symbol] 。
EM_CONFIG、EM_SDK 等。需要删除所有相关环境变量,以免 DotNet Wasm 编译命中旧版本库,因版本不匹配导致奇怪的编译失败。WeixinMiniGameSupport/BuildTools/DotNetWithWasm/packs/Microsoft.NET.Runtime.Emscripten.3.1.34.Sdk.linux-x64/8.0.0/tools/bin/wasm-opt,如果有复现 undefined symbol,考虑 remove 已安装的 emscripten/binaryen 相关工具链,或更改 LD_LIBRARY_PATH 确保命中正确库。Browser.mainLoop.scheduler is not a function
.c 的文件会被采集进入 emscripten 编译链路,如果 Plugin 中有把 .c 文件当作头文件 include 的情况,需要按需重命名为正确后缀 .h,否则可能遇到类似 wasm-ld duplicate symbol: xxxx /Library/Bee/artifacts/WeixinMiniGame/PlayerBrowserWasm/PlayerBrowserWasm.gen.csproj 的错误undefined symbol 来源为 xlua.c
解决方法为 xlua_webgl 勾选目标平台 WeixinMiniGame
Can not find System.MonoType
报错原因为:Mono 运行时 MonoType 被识别为一个“dummy类”。在 Mono 运行时中,MonoType 类用于判断当前程序是否运行在 Mono 运行时上。然而,在 DotNet Wasm 解决方案中使用的运行时环境中,并没有这个 MonoType 类,因此无法找到它,从而导致报错。
解决方法为:注释掉 xLua 中 LuaEnv.cs 脚本中关于 MonoType 的代码。
Code/wwwroot/_framework/blazor.boot.json 添加参数,开启 MONO LOG,并在Browser console中定位问题dll
开启 LOG 后,可能看到如下的 log:
以上的 log 说明 DOTween.Modules.dll 不存在,这与 DoTween 的 asmdef 生成策略相关。
* 如果有其他 log 无法定位问题排查请到开发者论坛或官方群
Wasm Exception,自团结1.2.0版本起可以手动切换到 Cxx Exception。由于部分第三方插件没有支持 wasm exception,此时需要切换。Publishing Settings -> Enable Exceptions 这个选项与 DotNet Wasm 无关。15.2 以前版本不支持 Wasm Exception,DotNet Wasm 游戏会加载失败,Cxx Exception 有更好的兼容性,但因为改变了所有开启异常函数的调用链路,因此可能引入额外性能损耗。需要根据项目做具体的 profile 分析。TypeLoadException: VTable setup of type xxx failed
Managed Stripping Level 是否开的太高,Managed Code Strip 开到 Low 或 Minimal 即可。该选项主要服务于 IL2CPP,使得 DLL 生成的 cpp 代码减少从而尽可能减少 Wasm 体积。由于 DotNet Wasm 是解释执行,即便不去做额外 Strip,相应的 IL 也只会作为 bytes 存储而不会展开,对内存影响微乎其微。
Argument_CultureInvalidIdentifier 多语言
InvariantGlobalization 目前设为 true,也就是默认 culture default 不变的模式,可以在 Library\Bee\artifacts\WeixinMiniGame\PlayerBrowserWasm\PlayerBrowserWasm.gen.csproj 更改。更改后会引入 dat,需要关注导出产物大小。InvariantGlobalization key,手动更改为 false,并在这个下方手动添加一行 <WasmIcuDataFileName>icudt_[xxx].dat</WasmIcuDataFileName> ,具体需要根据加载的语言选择dat文件,参考 Wasm 全球化相关文档。
Error.js 注释掉红框定义:
更多 DotNet 相关问题可前往技术交流社区。