Blazor Unmarshalled JavaScript 互操作

Blazor Unmarshalled JavaScript interop

为了提高 Blazor JS Interop 调用的性能,同步和未编组的 API 可用

我很难找到有关未编组的更多信息。

例如:

//javascript
JSFunctions.f1 = function (fields) {
    var f1 = Blazor.platform.readStringField(fields, 0);
    var f2 = Blazor.platform.readStringField(fields, 4);
    var f3 = Blazor.platform.readStringField(fields, 8);
};


//F#
[<Inject>]
member val Js: IJSRuntime
let js = this.Js :?> IJSUnmarshalledRuntime
js.InvokeUnmarshalled<ElementReference, string, unit>("JSFunctions.f1", er, txt)
  1. 函数 Blazor.platform.* 定义在哪里?
  2. 应该使用哪一个来检索 ElementReference 类型的参数?
  3. 函数readStringField的第二个int参数是什么,应该如何使用?

Blazor 对象是全局命名空间 (window) 中的 JavaScript 对象,由 blazor.webassembly.js 在 Blazor WebAssembly 中添加,或 blazor.server.js 在 Blazor Server 中添加。它通过以下脚本添加到 index.html(或 _Host.cshtml)末尾的 Blazor Apps 默认模板中:

<script autostart="false" src="_framework/blazor.webassembly.js"></script>

Blazor 对象提供 Blazor.platform 和一些有用的 api 例如 start() 用于手动启动 Blazor。 此脚本还将另一个名为 BINDING 的对象添加到全局命名空间(window.BINDING 或简称为 BINDING)。 它们提供以未编组的方式直接从 JavaScript 处理 .NET 对象的方法。例如,您可以使用

读取不同类型的数据
Blazor.platform.read....

您可以使用 ElementReference 类型的对象读取对象:

Blazor.platform.readObjectField(fields,index)

这里的fields是当你调用它时传递给JS函数的输入(结构或class),index是它在struct/class定义中的字段偏移量。您可以在 Microsoft 文档 here 中阅读有关字段偏移量的更多信息。 这是一些例子:

[StructLayout(LayoutKind.Explicit)]
    public struct InteropStruct
    {
        [FieldOffset(0)]
        public string Name;

        [FieldOffset(8)]
        public int Year;
    }

您还可以使用 BINDING 直接从 JavaScript 函数 return 一个 .Net 对象,如下所示:

return BINDING.js_string_to_mono_string(`Hello, ${name} (${year})!`);

您可以在浏览器开发人员工具中发现更多关于这两个对象的信息,例如通过编写 Blazor.platform.BINDING.: