首页 > 其他分享 >不成生DOM的非主流Blazor UI开源啦!

不成生DOM的非主流Blazor UI开源啦!

时间:2023-06-19 10:25:38浏览次数:43  
标签:原生 DOM PixUI CPoint UI Blazor public C#

  作者之前介绍了开发中的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,PixUI,CPoint,UI,Blazor,public,C#
From: https://www.cnblogs.com/BaiCai/p/17490417.html

相关文章

  • Phenomenon•Observation•Uncertainty/Certainty•Statistical law•Random phenomen
    Mathematics:thelogicofcertainty.Statistics:thelogicofuncertainty. Certainty/Uncertainty:  Phenomenon•Result Phenomenon->Observation->(Certainty,Uncertainty) Trial/Test:withinsameconditions;Observeobjectivephenomenon.......
  • hbuilder快捷键设置
    hbuilder快捷键设置: [//向下复制一行{"key":"ctrl+d","command":"editor.action.duplicate","override":true},//向下插入一行{"key":"shift+enter","command":"editor.action.insertLineAfte......
  • burpsuite 代理失败
    我开启了代理却抓不到数据包我使用chrome访问metasploitable2虚拟机的web本地页面,burp只能抓取到外网无法抓到本地网络,后来使用火狐开启代理成功抓取到流量经过。并且火狐的代理是内置的独立代理,与系统代理无关,系统设不设置,只要火狐设置就走代理......
  • 【人工智能】国产开源大模型聊天 AquilaChat 快速开始上手实战&效果评测
    【人工智能】国产开源大模型聊天AquilaChat快速开始上手实战&效果评测文章目录【人工智能】国产开源大模型聊天AquilaChat快速开始上手实战&效果评测禅与计算机程序设计艺术:评测结论——AquilaChat在写作水平上跟ChatGLM-6B差不多,但是AquilaChat多编程语言写代码能力还是......
  • 执行存储过程报错:User does not have access to metadata required to determine stor
    在执行存储过程中,报错详细信息如下:java.sql.SQLException:Userdoesnothaveaccesstometadatarequiredtodeterminestoredprocedureparametertypes.Ifrightscannotbegranted,configureconnectionwith"noAccessToProcedureBodies=true"tohavedrivergener......
  • [MAUI]弧形进度条与弧形滑块的交互实现
    @目录弧形基类定义绘制弧弧形进度条(ProgressBar)添加动画宽度补偿文本弧形滑块(Slider)创建控制柄拖动事件处理项目地址进度条(ProgressBar)用于展示任务的进度,告知用户当前状态和预期;滑块(Slider)通过拖动滑块在一个固定区间内进行选择数值范围。进度条和滑块都是进度值在UI界面......
  • setContentView(R.layout.activity_);ui->setupUi(this);
    publicclassTutorialPartIIIextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//setContentView(R.layout.activity_tutorial_part_iii);//*......
  • 参与共建 SolidUI AI 生成可视化项目:开源社区的力量
    背景SolidUI是一个开源的AI生成可视化项目,旨在帮助开发者快速构建可视化界面。我们诚挚邀请您加入SolidUI社区,与我们共同打造更加优秀的开源项目。本文将为您介绍如何参与到SolidUI的共建中来,包括相关链接、当前项目进展以及如何为项目做出贡献。https://github.com/CloudOrc/Sol......
  • Intel Quick Sync Video(QSV)
    安装和使用过程:1.InstallIntelMediaServerStudioforLinux.Downloadfromsoftware.intel.com/intel-media-serverstudio.Thisisaprerequisiteforthe*_qsvcodecsasitprovidesthefoundationforencodeacceleration.Seethenextchapterformoreinfoonedi......
  • 【雕爷学编程】Arduino动手做(115)---HB100多普勒雷达模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......