pre { overflow-y: auto; max-height: 300px }

  前一阵子帮朋友开发个微信小程序,一开始使用Wechat Devtools开发,实在受不了转用uniapp开发。后来突发奇想能否将C#写的PixUI编译成WebAssembly,由微信小程序加载运行。先上网搜了下小程序使用blazor的文章,都是用WebView包了一下blazor应用,没有参考价值,还是自己动手实现吧。

一、运行效果

  演示使用C#写的LiveCharts,点击按钮动态生成一些数据。

1. Android真机运行

2. 模拟器运行

二、实现原理

  原理比较简单,如下图所示,将C#写的PixUI应用及C++写的Skia引擎编译为WebAssembly,然后通过微信小程序的WXWebAssembly加载,并在canvas(WebGL)通过skia绘制出用户界面,监听微信小程序的事件传给C#处理后重新绘制界面。

三、开发步骤

1. 创建wasmconsole项目

创建项目前请确认已经通过dotnet workload install安装wasm-experimentalwasm-tools

dotnet new wasmconsole

2. 参考PixUI.Demo.Wasm.proj修改工程文件

3. 使用PixUI开发用户界面

4. 编译并分包

因微信小程序包大小限制问题,使用PixUI.WxmpPkgs工具自动拆分生成pkgs目录

5. 将如图所示的目录及文件复制进PixUI.Demo.Wxmp/miniprogram/dotnet目录内

6. 修改dotnet.native.js

因微信小程序的兼容问题,以及改动了dotnet的引导代码暂需要手动修改emcc编译生成的js。

  • 替换所有import.meta.urlglobalThis.bootUrl;
  • 搜索receiveInstace,将function receiveInstance(instance,module){wasmExports=instance.exports;替换为function receiveInstance(instance,module){wasmExports=instance.instance.exports;

7. 用Wechat Devtools打开PixUI.Demo.Wxmp工程即可运行

四、优势与劣势

优势

  • 代码复用:前后端可以统一开发语言,;
  • 动态加载:可以远程加载C#写的PixUI组件;

劣势

  • 包太大: 因打包了dotnet的mono运行时及skia引擎,目前不包含中文字体总的包大小差不多8.8MB,小程序首次加载根据网络情况会稍慢。

五、IOS真机问题

目前IOS真机上运行还有些问题,先在此记录。

1. WebAssembly不支持Exception Handling

WXWebAssembly加载时会报invalid wasm file错误, 暂编译不支持的版本绕过此问题。

2. JSC引擎的Function.length始终返回0

可以通过修改dotnet.runtime.js来绕过此问题, 搜索argument count mismatch for cwrap,将

if(o&&n&&o.length!==n.length&&(Pe(`argument count mismatch for cwrap ${e}`),o=void 0),"function"!=typeof o&&(o=Xe.cwrap(e,t,n,r))

替换为

if("function"!=typeof o&&(o=Xe.cwrap(e,t,n,r))

3. Jiterpreter造成微信闪退

暂通过修改dotnet.runtime.js来绕过此问题,搜索.tableSize,将

function(){if(ds)return;ds=!0;const e=ps(),t=e.tableSize,n=ot.emscriptenBuildOptions.runAOTCompilation?e.tableSize:1,

替换为

function(){return;if(ds)return;ds=!0;const e=ps(),t=e.tableSize,n=ot.emscriptenBuildOptions.runAOTCompilation?e.tableSize:1,

4. 报compiling function underran the stack错误,暂无解。请哪位熟悉WebAssembly的大神指点一下

六、小结

  本次尝试换种方式用自己熟悉的语言来开发微信小程序,也为AppBox快速开发框架做个用户端拓展实验。感兴趣的小伙伴可以直接clone https://github.com/enjoycode/PixUI.git ,用Wechat Devtools打开PixUI.Demo.Wxmp项目体验。如果感兴趣的小伙伴比较多,我会继续完善(包括将微信小程序的一些api用C#包装一下)。作者个人能力实在有限Bug在所难免,如有问题请邮件联系或Github Issue,欢迎感兴趣的小伙伴们加入共同完善,当然更欢迎赞助项目或给作者介绍工作(目前找工作中)。

换个方式用C#开发微信小程序的更多相关文章

  1. WordPress 网站开发“微信小程序“实战(二)

    原文链接:https://devework.com/wordpres...,转载请用明链注明来源,谢谢! 本文是"WordPress 开发微信小程序"系列的第二篇,本文记录的是开发 ...

  2. WordPress 网站开发“微信小程序“实战(三)

    本文是"WordPress 开发微信小程序"系列的第三篇,本文记录的是开发"DeveWork+"小程序1.2 版本的过程.建议先看完第一篇.第二篇再来阅读本文. ...

  3. 开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

    在上篇随笔<基于微信小程序的系统开发准备工作>介绍了开发微信小程序的一些前期的架构设计.技术路线 .工具准备等方面内容,本篇随笔继续这个步骤,逐步介绍我们实际开发过程中对SSL协议的申请及 ...

  4. 用Vue.js开发微信小程序:开源框架mpvue解析

    前言 mpvue 是一款使用 Vue.js 开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程 ...

  5. 利用WordPress REST API 开发微信小程序从入门到放弃

    自从我发布并开源WordPress版微信小程序以来,很多WordPress网站的站长问有关程序开发的问题,其实在文章:<用微信小程序连接WordPress网站>讲述过一些基本的要点,不过仍 ...

  6. webstorm开发微信小程序代码提醒(webstorm开发工具)

    使用了微信提供的开发工具是真心难用,卡顿厉害.中英文切写注释换相当不爽.还没办法多开窗口,相信大家也遇到过这种现象. 下边我们介绍下webstorm来开发微信小程序的一些配置: File---sett ...

  7. 快速开发微信小程序

    image.png 最近婷主在做微信小程序.自己的微信公众号也需要添加点料,乘着这次放假,把微信小程序研究了下.虽然没有做什么很强大的功能,不过好歹自己的公众号也有了微信小程序.够用即可. 1.需要先 ...

  8. 开发微信小程序入门前

    开发微信小程序入门前 百牛信息技术bainiu.ltd整理发布于博客园 2016年09月21日晚 微信发不了微信“小程序”的内测版,一时间整个互联网都炸了锅.个大新闻.论坛都在讨论这个事情. 作为互联 ...

  9. 使用uni-app开发微信小程序

    uni-app 开发微信小程序 前言 9月份,开始开发微信小程序,也曾调研过wepy/mpvue,考虑到后期跨端的需求,最终选择使用了uni-app,本文主要介绍如何使用uni-app搭建小程序项目, ...

  10. 基于小程序云Serverless开发微信小程序

    本文主要以使用小程序云Serverless服务开发一个记事本微信小程序为例介绍如何使用小程序云Serverless开发微信小程序.记事本小程序的开发涉及到云函数调用.云数据库存储.图片存储等功能,较好 ...

随机推荐

  1. Git的快速使用

    Git的快速使用 git提交到gitee 1.初始化本地仓库 git init 2.拉取远程仓库代码 git clone https://gitee.com/sword-level_0/mount-t ...

  2. Linux命令行连接蓝牙设备

    Linux命令行连接蓝牙设备 查看Bluetooth设备: hciconfig 启动一个Bluetooth设备,例如:hci0: hciconfig hci0 up 相关指令 查看特定的Bluetoo ...

  3. 【Spring】Spring的@Autowire注入Bean的规则测试

    背景 在项目中使用Spring的Bean,一般都使用默认的Bean的单例,并且结合@Autowire使用. 实在有同一个类型多个实例的情况,也使用@Qualifier或@Resource实现注入. 所 ...

  4. 开启 Typecho 的 gzip 压缩

    简介 GZip压缩,是一种网站速度优化技术,也是一把SEO优化利器,许多网站都采用了这种技术,以达到提升网页打开速度.缩短网页打开时间的目的. 网站采用Gzip压缩,还有一个好处,就是让你少了一份流量 ...

  5. Clean WeChat X 微信垃圾清理工具,提升硬盘空间

    Clean WeChat X是一款专业的微信清理工具,其拥有软件轻巧.干净.高效.免费等等特点,其能识别你电脑里的微信缓存.聊天记录.文件备份.小程序等等信息,方便大家选择性的清理文件. 多账号登录: ...

  6. Flink学习(八) Flink SQL & Table 编程和案例

    Flink Table & SQL 概述背景我们在前面的课时中讲过 Flink 的分层模型,Flink 自身提供了不同级别的抽象来支持我们开发流式或者批量处理程序,下图描述了 Flink 支持 ...

  7. 【数值计算方法】蒙特卡洛方法积分的Python实现

    原理不做赘述,参见[数值计算方法]数值积分&微分-python实现 - FE-有限元鹰 - 博客园,直接上代码,只实现1d,2d积分,N维积分的蒙特卡洛方法也类似. 代码 from typin ...

  8. HarmonyOS SDK让小红书鸿蒙用户尽享原生相机的拍摄之美

    小红书是深受年轻人喜爱的生活社交类社区平台,越来越多的人在小红书上分享旅行.日常.心情.近日,不少使用鸿蒙原生版小红书的细心用户已经发现,直接使用小红书拍摄照片与自己使用原相机拍摄有一样清晰美观的呈现 ...

  9. 提示词工程——AI应用必不可少的技术

    引言 在人工智能技术飞速发展的今天,大语言模型(LLM)已成为推动技术革新的核心引擎.然而,如何让这些"聪明"的模型真正落地业务场景.解决实际问题?答案往往不在于模型本身的参数规模 ...

  10. Netty基础—4.NIO的使用简介

    大纲 1.Buffer缓冲区 2.Channel通道 3.BIO编程 4.伪异步IO编程 5.改造程序以支持长连接 6.NIO三大核心组件 7.NIO服务端的创建流程 8.NIO客户端的创建流程 9. ...