我正在使用 Mono 将 C# 编译为 Wasm,以便在浏览器中使用它。运行以下命令会生成一堆 DLL、一个 wasm 文件和一些 JS 文件。
csc /target:library -out:regex101.dll \
/noconfig /nostdlib \
\
/r:$WASM_SDK/wasm-bcl/wasm/mscorlib.dll \
/r:$WASM_SDK/wasm-bcl/wasm/System.dll \
/r:$WASM_SDK/wasm-bcl/wasm/Facades/netstandard.dll \
/r:$WASM_SDK/framework/WebAssembly.Bindings.dll \
\
regex101.cs
mono $WASM_SDK/packager.exe \
--copy=always --out=./publish \
regex101.dll
如果我在网页中包含这些生成的 js 文件,我可以在浏览器中运行转换后的代码。然而,最终的大小(大约 23 个 dll + JS + Wasm)总共大约 15mb,这是非常大的,我相信这是因为没有运行死代码消除,并且包含了大量的框架。
有人建议我运行链接器(参见 https://github.com/firasdib/Regex101/issues/156#issuecomment-497281517)来执行死代码消除,但作为 .NET 新手,我是,我不知道该怎么做。
任何帮助将不胜感激。
OpenAI 的 ChatGPT 回答了这个问题:
可以使用Mono运行时提供的链接器工具对编译后的代码进行死码剔除。以下是要遵循的步骤: 1. 如果尚未安装 Mono 运行时,请在您的系统上安装它。您可以从官方网站下载最新版本的 Mono 运行时:https://www.mono-project.com/download/ 2. 在已编译的 DLL 文件上运行链接器工具以删除任何未使用的代码。链接器工具获取输入 DLL 列表并生成一个仅包含实际使用的代码的输出 DLL。运行链接器工具的命令是:
mono $WASM_SDK/linker.exe -o output.dll input.dll
将 output.dll 替换为要创建的输出 DLL 文件的名称,并将 input.dll 替换为要包含在输出中的每个输入 DLL 文件的名称。您可以在命令行上指定多个输入 DLL 文件。 3. 从链接器工具获得输出 DLL 文件后,您可以像以前一样使用打包工具使用它来生成 wasm 和 JS 文件:
mono $WASM_SDK/packager.exe --copy=always --out=./publish output.dll
这将生成可以包含在网页中的 wasm 和 JS 文件。通过运行链接器工具,您应该能够通过删除任何未使用的代码来显着减小编译代码的大小。