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

时间:2019-02-06 00:21:28

标签: .net mono webassembly

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

public static class C {
    public static int Add(int a, int b) => a + b;
}

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

问题:

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

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

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

1 个答案:

答案 0 :(得分:4)

这就是我发现的东西。

获取Mono WASM

我们将打开的文件夹称为WASM-SDK

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

准备.NET dll

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

  • 包含class C的主dll,我们称其为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

准备Web文件

  1. 从站点根目录下的mono.js复制mono.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>
  1. 如果使用IIS,请确保application/wasm扩展名有一个.wasm哑剧类型寄存器。

全部完成

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