如何在浏览器中使用 Mono WebAssembly 运行 一个简单的 .NET 方法?
How do I use Mono WebAssembly to run a simple .NET method in browser?
假设我在服务器上有一个 .NET dll 文件,它具有这个简单的 class:
public static class C {
public static int Add(int a, int b) => a + b;
}
我想在使用 Mono 的 WebAssembly 支持的浏览器中调用 C.Add
。
(假设我可以将 dll 下载到浏览器中,例如 fetch
)
问题:
- Mono 需要哪些 .js/.wasm 文件,我从哪里获得这些文件?
- 加载完所有内容后,如何从 JS 实际调用
C.Add
?
我检查了 npm,但没有在那里找到 Mono WASM。
注意:我已经有一个 dll,所以我对 WASM IL 解释器感兴趣,而不是 WASM AOT 构建。
这是我的发现。
获取 Mono WASM
- 步骤如下:docs/getting-started/obtain-wasm-sdk.md
- 简短摘要:您必须下载并解压 build from Jenkins
我们把解压后的文件夹命名为WASM-SDK
.
注意:如果您按照 Mono 文档中的描述 运行 packager.exe
,则可以跳过以下步骤,但我想在这里描述手动方法更好的理解。
准备 .NET dll
将以下 dll 放在您的站点根目录下(假设在 managed
文件夹下):
- 包含
class C
的主dll,我们称它为app.dll
- BCL依赖,本例中你只需要:
WASM-SDK\wasm-bcl\wasm\mscorlib.dll
WASM-SDK\wasm-bcl\wasm\Facades\netstandard.dll
WASM-SDK\framework\WebAssembly.Bindings.dll
准备网页文件
- 从站点根目录下的
WASM-SDK\release
复制 mono.js
和 mono.wasm
- 注册您的
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
扩展名有一个 application/wasm
MIME 类型寄存器。
全部完成
现在,一旦您打开 HTML,您应该会看到 C.Add: 3
登录在浏览器控制台中。
假设我在服务器上有一个 .NET dll 文件,它具有这个简单的 class:
public static class C {
public static int Add(int a, int b) => a + b;
}
我想在使用 Mono 的 WebAssembly 支持的浏览器中调用 C.Add
。
(假设我可以将 dll 下载到浏览器中,例如 fetch
)
问题:
- Mono 需要哪些 .js/.wasm 文件,我从哪里获得这些文件?
- 加载完所有内容后,如何从 JS 实际调用
C.Add
?
我检查了 npm,但没有在那里找到 Mono WASM。
注意:我已经有一个 dll,所以我对 WASM IL 解释器感兴趣,而不是 WASM AOT 构建。
这是我的发现。
获取 Mono WASM
- 步骤如下:docs/getting-started/obtain-wasm-sdk.md
- 简短摘要:您必须下载并解压 build from Jenkins
我们把解压后的文件夹命名为WASM-SDK
.
注意:如果您按照 Mono 文档中的描述 运行 packager.exe
,则可以跳过以下步骤,但我想在这里描述手动方法更好的理解。
准备 .NET dll
将以下 dll 放在您的站点根目录下(假设在 managed
文件夹下):
- 包含
class C
的主dll,我们称它为app.dll
- BCL依赖,本例中你只需要:
WASM-SDK\wasm-bcl\wasm\mscorlib.dll
WASM-SDK\wasm-bcl\wasm\Facades\netstandard.dll
WASM-SDK\framework\WebAssembly.Bindings.dll
准备网页文件
- 从站点根目录下的
WASM-SDK\release
复制mono.js
和mono.wasm
- 注册您的
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
扩展名有一个application/wasm
MIME 类型寄存器。
全部完成
现在,一旦您打开 HTML,您应该会看到 C.Add: 3
登录在浏览器控制台中。