如何使用Mono WebAssembly在浏览器中运行简单的.NET方法?

And*_*kin 5 .net mono webassembly

假设我在服务器上有一个.NET dll文件,该文件具有以下简单类:

public static class C {
    public static int Add(int a, int b) => a + b;
}
Run Code Online (Sandbox Code Playgroud)

我想C.Add使用Mono的WebAssembly支持在浏览器中调用。
(假设我可以将dll下载到浏览器中,例如使用fetch

问题:

  1. Mono需要哪些.js / .wasm文件,我应该从哪里获得这些文件?
  2. 加载完所有内容后,如何实际C.Add从JS 调用?

我检查了npm,但在那里没有找到Mono WASM。

注意:我已经有一个dll,所以我对WASM IL解释器感兴趣,而不对WASM AOT构建感兴趣。

And*_*kin 8

这是我发现的。

获取Mono WASM

我们将其称为解压后的文件夹WASM-SDK

注意:如果您packager.exe按照Mono文档中的描述运行,则可以跳过以下步骤,但是我想在此处描述手动方法,以便更好地理解。

准备.NET dll

将以下dll放在您的网站根目录下(在managed文件夹下说):

  • 包含的主dll class C,我们称之为app.dll
  • BCL依赖关系,在这种情况下,您只需要:
    1. WASM-SDK\wasm-bcl\wasm\mscorlib.dll
    2. WASM-SDK\wasm-bcl\wasm\Facades\netstandard.dll
    3. WASM-SDK\framework\WebAssembly.Bindings.dll

准备网页文件

  1. 复制mono.jsmono.wasmWASM-SDK\release您的网站根目录下
  2. 注册Module并导入mono.js
<script>
window.Module = {};
window.Module.onRuntimeInitialized = () => {
   const config = {
       vfsPrefix: "managed",
       deployPrefix: "managed",
       enableDebugging: 0
   };
   const assemblies = [
       'app.dll',
       'mscorlib.dll',
       'WebAssembly.Bindings.dll',
       'netstandard.dll'
   ];
   MONO.mono_load_runtime_and_bcl(
       config.vfsPrefix,
       config.deployPrefix,
       config.enableDebugging,
       assemblies,
       () => {
          Module.mono_bindings_init("[WebAssembly.Bindings]WebAssembly.Runtime");
          const add = Module.mono_bind_static_method("[app] C:Add");

          // ?? This is what calls C.Add():
          console.log('C.Add:', add(1, 2));
       }
   )
};
<script>
<script async src="mono.js"></script>
Run Code Online (Sandbox Code Playgroud)
  1. 如果使用IIS,请确保application/wasm.wasm扩展名有一个mime类型寄存器。

全部做完

现在,一旦打开HTML,您应该会C.Add: 3在浏览器控制台中看到登录信息。