Dot-Net

如何使用 Mono WebAssembly 在瀏覽器中執行簡單的 .NET 方法?

  • November 14, 2019

假設我在伺服器上有一個 .NET dll 文件,它有一個簡單的類:

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

我想C.Add使用 Mono 的 WebAssembly 支持在瀏覽器中呼叫。

(假設我可以將 dll 下載到瀏覽器中,例如使用fetch

問題:

  1. Mono 需要哪些 .js/.wasm 文件,我從哪裡獲得這些文件?
  2. 載入完所有內容後,我如何實際C.Add從 JS 呼叫?

我檢查了 npm,但在那裡沒有找到 Mono WASM。

注意:我已經有一個 dll,所以我對 WASM IL 解釋器感興趣,而不是 WASM AOT 建構。

這是我發現的。

獲取 Mono WASM

我們稱之為解壓文件夾WASM-SDK

注意:如果按照 Mono 文件中的描述執行,則可以跳過以下步驟packager.exe,但我想在此處描述手動方法以便更好地理解。

準備 .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

準備 Web 文件

  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>
  1. 如果使用 IIS,請確保有擴展的application/wasmmime 類型寄存器。.wasm

全部做完

現在,一旦您打開 HTML,您應該C.Add: 3會在瀏覽器控制台中看到已登錄。

引用自:https://stackoverflow.com/questions/54545028