以下默认使用 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 相关问题可前往技术交流社区。