Как использовать Mono WebAssembly для запуска простого метода .NET в браузере? - PullRequest
0 голосов
/ 06 февраля 2019

Допустим, у меня есть файл .NET dll на сервере, который имеет этот простой класс:

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

Я хочу вызвать C.Add в браузере с использованием поддержки MonAs WebAssembly.
(предположим,что я могу загрузить dll в браузер, например, с помощью fetch)

Вопросы:

  1. Какие файлы .js / .wasm необходимы для Mono и где их взять?
  2. Как только все будет загружено, как мне на самом деле вызвать C.Add из JS?

Я проверил npm, но не нашел там Mono WASM.

Примечание: у меня уже есть dll, поэтому меня интересует интерпретатор WASM IL, а не сборка WASM AOT.

1 Ответ

0 голосов
/ 08 февраля 2019

Вот что я нашел.

Получить Mono WASM

Давайте назовем распакованную папку WASM-SDK.

Примечание : вы можете пропустить следующие шаги, если вы запустите packager.exe, как описано в Mono docs, но я хочу описать здесь ручной подход для лучшего понимания.

Подготовка .NET dlls

Поместите следующие 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.js и mono.wasm из WASM-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>
Если вы используете IIS, убедитесь, что для расширения .wasm есть регистр MIME-типа application/wasm.

Все сделано

Теперь, когда вы открываете свой HTML, выдолжен увидеть C.Add: 3 зарегистрировано в консоли браузера.

...