作者之前介绍了开发中的PixUI,为了适配Web应用采用了将C#通过Roslyn语法语义分析后转换为Javascript的方案,但是这样带来的问题是工程量较大,在短时间内无法达到生产级质量。因此在简单评估了Blazor技术后决定暂使用Blazor WebAssembly来实现PixUI的Web端。本文记录一些Blazor链接原生(C/C++)库过程中所踩过的坑,同时为了庆祝儿子考完10年内最难中考提前宣布PixUI正式开放源码,基本概念介绍请参考上一篇。

PixUI源码: https://github.com/enjoycode/PixUI

请先安装 dotnet workload install wasm-tools

打开PixUI.sln运行PixUI.Platform.Blazor项目

坑一: 原生函数返回结构体无法编译链接的问题

  示例C结构体与函数定义如下:

typedef struct {
uint32_t x;
uint32_t y;
} CPoint; CPoint get_point(); //返回结构体

此时C#封装的Api调用上述函数在Blazor WebAssembly链接时会报错,需要包装原生函数如下:

void get_point_wasm(CPoint* cpoint);

对应的C# Api代码为:

public struct CPoint {
public uint x;
public uint y;
} [LibraryImport("nativeLibName")]
public static partial unsafe void get_point_wasm(CPoint* cpoint);

坑二: 原生函数回调C#方法的问题

  C#的回调方法必须是静态方法,同时标上UnmanagedCallersOnly特性,且参数不能有结构体(可以用结构体指针代替),示例如下:

[UnmanagedCallersOnly]
public static unsafe void Callback(CPoint* cpoint) { /*...*/ }

  在将C#回调方法封送给原生函数时参考如下示例,注意因Blazor WebAssembly的Bug,回调地址只能是IntPtr类型:

var callbackPtr = (IntPtr)(delegate* unmanaged<void, CPoint*>)&Callback;
c_api(callbackPtr); //将回调地址封送给原生函数

坑三: Unicode库ICU4C的问题

  因Blazor WebAssembly生成的icudt.dat文件不包含skia库需要的一些Feature(比如:分词、换行等),所以需要参考https://github.com/dotnet/icu.git自己定义并重新生成该数据文件,并且配置Blazor项目替换相应的数据文件。

小结

  最后预告一下使用PixUI开发中的低代码快速开发框架AppBox,通过内置的开发环境将传统应用开发过程中的数据结构、业务逻辑、用户界面等抽象为模型,组合模型形成完整的应用。



  力量有限,欢迎感兴趣的小伙伴加入共同完善!

不成生DOM的非主流Blazor UI开源啦!的更多相关文章

  1. 10个顶级的CSS UI开源框架

    随着CSS3和HTML5的流行,我们的WEB页面不仅需要更人性化的设计理念,而且需要更酷的页面特效和用户体验.作为开发者,我们需要了解一些宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现 ...

  2. Android主流UI开源库整理(转载)

    http://www.jianshu.com/p/47a4a7b99364 标题隐含了两个层面的意思,一个是主流,另一个是UI.主流既通用,一些常规的按钮.Switch.进度条等控件都是通用控件,因此 ...

  3. web前端开发常用的10个高端CSS UI开源框架

    web前端开发常用的10个高端CSS UI开源框架   随着人们对体验的极致追求,web页面设计也面临着新的挑战,不仅需要更人性化的设计理念,还需要设计出更酷炫的页面.作为web前端开发人员,运用开源 ...

  4. [转]10个顶级的CSS UI开源框架

    随着CSS3和HTML5的流行,我们的WEB页面不仅需要更人性化的设计理念,而且需要更酷的页面特效和用户体验.作为开发者,我们需要了解一些宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现 ...

  5. 基于CSS UI开源框架汇总

    从16年数据统计就有20几款UI框架出现在市面上,至今为止能统计的框架应该有40款左右了.前端框架都是基于HMTL5.CSS.JS开发的,这里主要给大家聊一下CSS UI开源框架有哪些?以后工作中选择 ...

  6. web前端的10个顶级CSS UI开源框架

    随着CSS3和HTML5的流行,我们的WEB页面不仅需要更人性化的设计理念,而且需要更酷的页面特效和用户体验.作为开发者,我们需要了解一些宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现 ...

  7. Android(常用)主流UI开源库整理

    这几天刚做完一个项目..有点空余时间,就想着吧这一两年做的项目中的UI界面用到的一些库整理一下.后来想了一下,既然要整理,就把网上常用的 AndroidUI界面的主流开源库 一起整理一下,方便查看. ...

  8. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  9. 正式发布! .NET开发控件集ComponentOne 新版本加入Blazor UI

    近期,由葡萄城推出的ComponentOne .NET开发控件集正式发布最新版本! ComponentOne 是一套专注于企业 .NET开发.支持 .NET Core 平台,并完美集成于 Visual ...

  10. Blazor组件提交全记录: FullScreen 全屏按钮/全屏服务 (BootstrapBlazor - Bootstrap 风格的 Blazor UI 组件库)

    Blazor 简介 Blazor 是一个使用 .NET 生成的交互式客户端 Web UI 的框架.和前端同学所熟知的 Vue.React.Angular 有巨大差异. 其最大的特色是使用 C# 代码( ...

随机推荐

  1. Notion AI : 让表达如此简单

    前言 写作如说话,想说与说明白中间隔着沟壑! 下面用 Notion AI 作诗来作为本文开头吧. 想说与说明白(作者:Notion AI) 想说千言万语,说明白却难如登天. 言语之间,沟壑重重,思想与 ...

  2. Python 人工智能 5秒钟偷走你的声音

    介绍 Python 深度学习AI - 声音克隆.声音模仿,是一个三阶段的深度学习框架,允许从几秒钟的音频中创建语音的数字表示,并用它来调节文本到语音模型,该模型经过培训,可以概括到新的声音. 环境准备 ...

  3. Looper 源码分析

    //可以看到我们的Looper是存放在线程独有的ThreadLocal进行隔离的    //也就是每个线程独有一份Looper    static final ThreadLocal<Loope ...

  4. mybatis:Could not set parameters for mapping: ParameterMapping

    报错: 展开查看 org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org. ...

  5. Ffmpeg分布式视频转码问题总结

    本文主要聊一聊云原生时代分布式转码系统实施过程中碰到的一些问题. 聊问题之前简单介绍一下我们的分布式转码方案. 云原生分布式转码 在计算资源招之即来的云计算时代,正在重构着软件架构的方方面面. 对软件 ...

  6. Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新

    Hystrix 简介 Hystrix 是 Netflix 开源的一个限流熔断降级组件,防止依赖服务发生错误后,将调用方的服务拖垮.这里对 Hystrix 本身不做过多介绍. Hystrix 目前处于维 ...

  7. 浏览器发送POST请求、DELETE请求

    1.浏览器发送POST请求 方法一: var xml = new XMLHttpRequest(); var url = "http://127.0.0.1:8800/admin/user& ...

  8. Golang每日一库之bcrypt

    本文 官方文档: https://pkg.go.dev/golang.org/x/crypto/bcrypt 前言 之前讲过JWT Token https://www.cnblogs.com/zich ...

  9. JavaFx 生成二维码工具类封装

    原文地址: JavaFx 生成二维码工具类封装 - Stars-One的杂货小窝 之前星之音乐下载器有需要生成二维码功能,当时用的是一个开源库来实现的,但是没过多久,发现那个库依赖太多,有个http- ...

  10. 响应式的 switchboard:让又大又慢的Vue/AIpine 页面爆快

    我的提示: AIpine 是一个js 库,官网口号是 "一个新的轻量极javascript框架",其实我之前也没接触过,翻译这篇文章时才注意到 官方地址: [AIpine.js]h ...