我有这个简单的Rust函数:
#[no_mangle]
pub fn compute(operator: &str, n1: i32, n2: i32) -> i32 {
match operator {
"SUM" => n1 + n2,
"DIFF" => n1 - n2,
"MULT" => n1 * n2,
"DIV" => n1 / n2,
_ => 0
}
}
Run Code Online (Sandbox Code Playgroud)
我正在成功地将其编译为WebAssembly,但是没有设法将operator参数从JS 传递给Rust.
调用Rust函数的JS行如下所示:
instance.exports.compute(operator, n1, n2);
Run Code Online (Sandbox Code Playgroud)
operator是JS String和n1,n2是JS Number秒.
n1并且n2正确传递并且可以在编译函数内部读取,所以我猜问题是我如何传递字符串.我想它是作为从JS到WebAssembly的指针传递,但无法找到有关其工作原理的证据或材料.
我没有使用Emscripten并希望将其保持独立(编译目标wasm32-unknown-unknown),但我看到它们将其编译的函数包装起来Module.cwrap,也许这可能会有所帮助?
项目珠穆朗玛峰上的好人们编写了一个正式验证的加密库,称为HACL*,用于Web组装.遗憾的是,没有使用此处定义的代码的示例.
我用Version 71.0.3578.98 (Official Build) (64-bit)Chrome 测试了代码.
这实际上是我在客户端上尝试的,以获得一个有效的例子.
var module = HaclLoader().then(function(m) {
var state_buffer = new ArrayBuffer(32);
var state = new Uint32Array(state_buffer);
var message_buffer = new ArrayBuffer(32);
var message = new Uint8Array(message_buffer);
for (var i = 0; i < message.length; i++) {
message[i] = i;
}
var hash_buffer = new ArrayBuffer(32);
var hash = new Uint8Array(hash_buffer);
m._Hacl_SHA2_256_init(state);
m._Hacl_SHA2_256_update(state, message);
m._Hacl_SHA2_256_finish(state, hash);
console.log(hash);
});
Run Code Online (Sandbox Code Playgroud)
引用的代码尝试使用此处定义的函数.不幸的是,这个示例代码不起作用,哈希最终成为零数组.
我正在尝试在WASM解决方案中使用SKIA lib。首先,我使用波纹管配置将Skia编译为wasm位代码:
/bin/gn gen ./out/Build-wasm-Release/Release --args="cc=\"emcc\" extra_cflags_cc=[\"-frtti\",\"-s\",\"USE_FREETYPE=1\"] cxx=\"em++\" extra_cflags=[\"-Wno-unknown-warning-option\",\"-s\",\"USE_FREETYPE=1\",\"-s\",\"USE_LIBPNG=1\"] \
is_debug=false \
is_official_build=true \
is_component_build=false \
target_cpu=\"wasm\" \
\
skia_use_egl=false \
skia_use_vulkan=false \
skia_use_libwebp=false \
skia_use_libpng=true \
skia_use_lua=false \
skia_use_dng_sdk=false \
skia_use_fontconfig=false \
skia_use_libjpeg_turbo=false \
skia_use_libheif=false \
skia_use_expat=false \
skia_use_vulkan=false \
skia_use_freetype=false \
skia_use_icu=false \
skia_use_expat=false \
skia_use_piex=false \
skia_use_zlib=true \
skia_enable_gpu=true \
skia_enable_pdf=false"
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下命令编译自己的代码时,它已成功编译:
em++ multiply.cpp -o multiply.js -s EXPORTED_FUNCTIONS="['_float_multiply','_float_multiply_array','_sample_array_rtn','_sample_array_float_rtn','_msd_main']"-s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' -s ALLOW_MEMORY_GROWTH=1 -s USE_WEBGL2=1 -s NO_EXIT_RUNTIME=1 -s USE_LIBPNG=1 -s WASM=1 -s MODULARIZE=1 -s FORCE_FILESYSTEM=0 -I$SKIAPATH/include/ -I$SKIAPATH/include/gpu -I$SKIAPATH/include/core …Run Code Online (Sandbox Code Playgroud) 有谁知道当前是否可以从编译成wasm的C#中调用C ++(或者更精确地说是Uno Platform应用程序)?
我对WebAssembly相当陌生,但是我设法将C ++函数编译为wasm并从JavaScript调用它。我还从Uno获得了一个快速入门项目(该项目可让您将用C#/ XAML编写的UWP应用编译为wasm并在浏览器中运行)。
我每天都用C#和C ++编写程序,但是我不知道是“两种语言之间的互操作” + WebAssembly组合。我假设我需要将两种语言的代码编译为2个单独的wasm文件,然后以某种方式将它们链接在一起或在运行时加载C ++。今天我什至想做些什么吗?
编辑:要明确:的想法是所有代码最终都将编译为wasm。
使用web-sys crate,我想从HTMLDocument.
我想做这样的事情。确实这行不通。
let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let cookie = document.cookie().unwrap();
//no method named `cookie` found for type `web_sys::features::gen_Document::Document` in the current scope
Run Code Online (Sandbox Code Playgroud)
我需要访问HTMLDocument结构而不是Document结构。
Cargo.toml 已启用功能。
~snip~
[dependencies.web-sys]
version = "0.3.4"
features = [
"WebSocket",
'Window',
'Document',
'HtmlDocument',
]
Run Code Online (Sandbox Code Playgroud)
根据API,它应该可以在以下位置访问Window,例如Document.
它似乎不适用于以下内容:
let html_document = window.html_document().unwrap();
Run Code Online (Sandbox Code Playgroud)
从文档来看,HTMLDocument应该扩展Document。
我知道 Rust 中没有继承,但我无法将其转换Document为这样:
let html_document = web_sys::HtmlDocument::from(document); …Run Code Online (Sandbox Code Playgroud) 我试图在 node.js 中本地实例化一个 .wasm 文件。目标是在本地运行二进制文件并重现网页的功能。这是我的最小可重现示例:
const fetch = require("node-fetch");
const importObject = {
imports: {
imported_func: function(arg) {
console.log(arg);
}
}
};
fetch('https://www.supremenewyork.com/ticket.wasm').then(response =>
response.arrayBuffer()
).then(bytes => {
let mod = new WebAssembly.Module(bytes);
let instance = new WebAssembly.Instance(mod, importObject);
instance.exports.exported_func();
})
Run Code Online (Sandbox Code Playgroud)
我得到的错误是: TypeError: WebAssembly.Instance(): Import #0 module="wasi_unstable" error: module is not an object or function
我看到了一些类似问题的问题,但没有提供真正的解决方案。这是我第一次与 wasm 合作,所以我很迷茫。
谢谢你的帮助。
该ctor板条箱目前不支持 Web 程序集,尽管有关于如何解决此问题的积极讨论。
尽管我很清楚与来自 C++ 的静态初始化相关的问题,但能够在启动时向工厂注册事物是一项非常方便的功能,并且在很多情况下是避免违反 DRY 原则所必需的。如果没有它,每次您想为工厂添加新的可能性时,您都必须向 中添加单独的代码main()行,如果您需要导入新函数,则可能会添加更多行。这很快就会变得乏味。
我想知道是否有可能使用过程属性宏和build.rs. 该宏将用于标记我想要注册的函数,它的实现会将"crate::your::registered_function"这些函数的模块路径 ( )保存到文件中某处的一侧,否则只是一个传递。然后build.rs将生成一个调用文件中列出的所有函数的函数,我将main()手动调用该函数。
module_path!,但如果从程序宏的定义中调用它会给模块路径为宏,而不是与什么的TokenStream将会扩展到相关的模块路径。宏可以生成对 的调用,module_path!但要等到最终程序运行时才会进行评估。我试图允许用户在 C 中调用“main”并让“main”等待 requestAnimationFrame 继续执行。即 main 可以有一个 while(1) 循环,而在 main 中,会有一个“waitForAnimationFrame”...或者允许实现像 sleep(...) 这样的函数。
我一直在挖掘 emscripten 如何实际执行此操作的内部工作原理,但它看起来不太适合我的目的。这个页面涉及了许多与我想做的事情非常接近的事情,但是当以这种方式实现时,它们似乎都没有实际工作。https://kripken.github.io/blog/wasm/2019/07/16/asyncify.html
更具体地说,似乎最好的方法是保存堆栈,然后通过 Wasm 中的虚拟函数“返回”,然后当事件在 javascript 中发生时,我可以调用一个虚拟函数但返回到正确的位置。但是,这将需要调用堆栈,它似乎不是实际的一部分STACKTOP,或者通过stackSave和可用stackRestore。最值得注意的是,无论我似乎做什么似乎都setThrew不起作用。即它只是立即返回。
我还尝试使用一些启动/停止展开功能,但由于从 Javascript 返回到 Wasm 时出现错误,因此无法在那里取得进展。
这里有什么想法吗?我真的不能像某些人想要的那样使 main 异步并期望它仍然以相同的方式工作。
编辑:好的,这是我正在测试的一些示例。
示例 1:保存/恢复堆栈
在 C 中有这两个函数:
void waittask()
{
volatile int sentinel = 85755555;
consolelog("waittask1");
waitout();
consolelog("waittask2");
}
void waitret()
{
volatile int sentinel = 12994423;
consolelog("waitret1");
stacksetup(sentinel);
stacksetup(sentinel);
consolelog("waitret2");
}
Run Code Online (Sandbox Code Playgroud)
使用 JavaScript 函数:
stacksetup : function() {
console.log( "STACK SETUP" ); …Run Code Online (Sandbox Code Playgroud) I have a blazor component with an EventCallBack parameter that utilized the new struct format allowing multiple arguments
[Parameter] public EventCallback<(EmployeeShiftDay, DateTime, DateTime)> NewDayScrolledIntoView { get; set; }
Run Code Online (Sandbox Code Playgroud)
eventcallback is invoked in child normally as such
await NewDayScrolledIntoView.InvokeAsync(p1, p2, p3);
Run Code Online (Sandbox Code Playgroud)
In my host page I have the corresponding method to handle the invoke
private void NewDayInView(EmployeeShiftDay dayInView, DateTime weekStart, DateTime weekEnd)
{
...
}
Run Code Online (Sandbox Code Playgroud)
How do I add the markup for this EventCallBack in the host component - I need …
很长一段时间以来一直在用 Go 编程,最近开始研究 WebAssembly。虽然大多数事情都很简单,但在将一些 Go 特定的结构(如通道和 goroutines)转换为 wasm 时有一个问题。在 JS 中使用时,它们的行为是否与在 Go 中使用时的行为方式相同(例如,goroutines 作为异步函数公开给 JS 等)?
webassembly ×10
javascript ×3
rust ×3
c++ ×2
emscripten ×2
.net-5 ×1
blazor ×1
c ×1
c# ×1
go ×1
llvm ×1
node.js ×1
rust-macros ×1
skia ×1
string ×1
uno-platform ×1