【问题标题】:Can C++ be called from C# compiled to wasm?可以从编译为 wasm 的 C# 调用 C++ 吗?
【发布时间】:2019-10-21 08:06:40
【问题描述】:

有谁知道目前是否可以从编译为 wasm(或者更准确地说是 Uno Platform 应用程序)的 C# 调用 C++?

我对 WebAssembly 还很陌生,但我设法将 C++ 函数编译为 wasm 并从 JavaScript 调用它。 我还从 Uno 获得了快速启动项目(它允许您将用 C#/XAML 编写的 UWP 应用编译为 wasm 并在浏览器中运行)运行。

我每天都编写 C# 和 C++,但我想不通的是“两种语言之间的互操作”+ WebAssembly 组合。 我假设我需要将两种语言的代码编译为 2 个单独的 wasm 文件,然后以某种方式将它们链接在一起或在运行时加载 C++ 文件。 我今天想做的事有可能吗?

编辑:要明确一点:这个想法是所有代码最终都编译为 wasm。

【问题讨论】:

  • This 可能有用。
  • @OrkhanAlikhanov 我认为这行不通。我真的没有原生 dll:我的 C++ 也应该是 wasm 并在浏览器中跨平台运行。即使它是一个本机 dll,我也怀疑 PInvoking 会起作用,毕竟它不是好的旧 CLR。​​
  • 好的@OrkhanAlikhanov,PInvoke 似乎是要走的路,但需要先在项目中正确设置。

标签: c# c++ webassembly uno-platform


【解决方案1】:

从上个月开始,mono-wasm 运行时支持 P/Invoke,使用两种模式:

  • 使用单声道解释器运行时,任意 WebAssembly 模块的Dynamic linking
  • 在 mono 的 AOT 下运行时,由先前的 emscripten 调用生成的 LLVM 位码文件的静态链接

后者目前正在 Uno.Wasm.Bootstrapper in this PR 中工作。

它与另一个 .NET 运行时的行为完全相同,这意味着 C++ 无法直接访问,您必须公开 C API 才能使用它。

使用 C++ 有一些注意事项,其中运行时需要强制包含在单声道运行时的二进制文件中,使其更大。这可能很快就会改变,因为 emscripten 正在转向完整的 LLVM 后端。

一些文档适用于 Uno.Wasm.Bootstrapper 是 available here

【讨论】:

  • 谢谢,这就是我要找的!
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多