換個(gè)方式使用C#開發(fā)微信小程序的過程
前一陣子幫朋友開發(fā)個(gè)微信小程序,一開始使用Wechat Devtools開發(fā),實(shí)在受不了轉(zhuǎn)用uniapp開發(fā)。后來突發(fā)奇想能否將C#寫的PixUI編譯成WebAssembly,由微信小程序加載運(yùn)行。先上網(wǎng)搜了下小程序使用blazor的文章,都是用WebView包了一下blazor應(yīng)用,沒有參考價(jià)值,還是自己動(dòng)手實(shí)現(xiàn)吧。
一、運(yùn)行效果
演示使用C#寫的LiveCharts,點(diǎn)擊按鈕動(dòng)態(tài)生成一些數(shù)據(jù)。
1. Android真機(jī)運(yùn)行
2. 模擬器運(yùn)行
二、實(shí)現(xiàn)原理
原理比較簡單,如下圖所示,將C#寫的PixUI應(yīng)用及C++寫的Skia引擎編譯為WebAssembly,然后通過微信小程序的WXWebAssembly加載,并在canvas(WebGL)通過skia繪制出用戶界面,監(jiān)聽微信小程序的事件傳給C#處理后重新繪制界面。
三、開發(fā)步驟
1. 創(chuàng)建wasmconsole項(xiàng)目
創(chuàng)建項(xiàng)目前請(qǐng)確認(rèn)已經(jīng)通過dotnet workload install
安裝wasm-experimental
及wasm-tools
dotnet new wasmconsole
2. 參考PixUI.Demo.Wasm.proj修改工程文件
3. 使用PixUI開發(fā)用戶界面
4. 編譯并分包
因微信小程序包大小限制問題,使用PixUI.WxmpPkgs
工具自動(dòng)拆分生成pkgs目錄
5. 將如圖所示的目錄及文件復(fù)制進(jìn)PixUI.Demo.Wxmp/miniprogram/dotnet目錄內(nèi)
6. 修改dotnet.native.js
因微信小程序的兼容問題,以及改動(dòng)了dotnet的引導(dǎo)代碼暫需要手動(dòng)修改emcc編譯生成的js。
- 替換所有
import.meta.url
為globalThis.bootUrl
; - 搜索
receiveInstace
,將function receiveInstance(instance,module){wasmExports=instance.exports;
替換為function receiveInstance(instance,module){wasmExports=instance.instance.exports;
7. 用Wechat Devtools打開PixUI.Demo.Wxmp工程即可運(yùn)行
四、優(yōu)勢(shì)與劣勢(shì)
優(yōu)勢(shì)
- 代碼復(fù)用:前后端可以統(tǒng)一開發(fā)語言,;
- 動(dòng)態(tài)加載:可以遠(yuǎn)程加載C#寫的PixUI組件;
劣勢(shì)
- 包太大: 因打包了dotnet的mono運(yùn)行時(shí)及skia引擎,目前不包含中文字體總的包大小差不多8.8MB,小程序首次加載根據(jù)網(wǎng)絡(luò)情況會(huì)稍慢。
五、IOS真機(jī)問題
目前IOS真機(jī)上運(yùn)行還有些問題,先在此記錄。
1. WebAssembly不支持Exception Handling
WXWebAssembly加載時(shí)會(huì)報(bào)invalid wasm file
錯(cuò)誤, 暫編譯不支持的版本繞過此問題。
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. 報(bào)compiling function underran the stack
錯(cuò)誤,暫無解。請(qǐng)哪位熟悉WebAssembly的大神指點(diǎn)一下。
六、小結(jié)
本次嘗試換種方式用自己熟悉的語言來開發(fā)微信小程序,也為AppBox快速開發(fā)框架做個(gè)用戶端拓展實(shí)驗(yàn)。感興趣的小伙伴可以直接clone https://github.com/enjoycode/PixUI.git ,用Wechat Devtools打開PixUI.Demo.Wxmp項(xiàng)目體驗(yàn)。如果感興趣的小伙伴比較多,我會(huì)繼續(xù)完善(包括將微信小程序的一些api用C#包裝一下)。作者個(gè)人能力實(shí)在有限Bug在所難免,如有問題請(qǐng)郵件聯(lián)系或Github Issue,歡迎感興趣的小伙伴們加入共同完善,當(dāng)然更歡迎贊助項(xiàng)目或給作者介紹工作(目前找工作中)。
到此這篇關(guān)于換個(gè)方式用C#開發(fā)微信小程序的文章就介紹到這了,更多相關(guān)C#開發(fā)微信小程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中String StringBuilder StringBuffer類的用法
這篇文章給大家簡單介紹下C#中String StringBuilder StringBuffer三個(gè)類的用法,需要的的朋友參考下吧2017-05-05Unity實(shí)現(xiàn)簡單換裝系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡單換裝系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04C#連接mysql數(shù)據(jù)庫完整實(shí)例
這篇文章主要介紹了C#連接mysql數(shù)據(jù)庫的方法,以一個(gè)完整實(shí)例形式分析了C#操作mysql數(shù)據(jù)庫連接的基本技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05C#網(wǎng)絡(luò)編程基礎(chǔ)之進(jìn)程和線程詳解
這篇文章主要介紹了C#網(wǎng)絡(luò)編程基礎(chǔ)之進(jìn)程和線程詳解,本文對(duì)進(jìn)程、線程、線程池知識(shí)做了淺顯易懂的講解,并配有代碼實(shí)例,需要的朋友可以參考下2014-08-08C#創(chuàng)建磁性窗體的實(shí)現(xiàn)方法
經(jīng)常會(huì)遇到一種情況,即當(dāng)拖動(dòng)一個(gè)窗體(主窗體)時(shí),其他窗體(子窗體)隨著該窗體移動(dòng),當(dāng)拖動(dòng)子窗體時(shí),其他窗體將不跟隨移動(dòng),這就是磁性窗體,所以本文給大家介紹了C#創(chuàng)建磁性窗體的實(shí)現(xiàn)方法,需要的朋友可以參考下2024-04-04C#簡易圖片格式轉(zhuǎn)換器實(shí)現(xiàn)方法
這篇文章主要介紹了C#簡易圖片格式轉(zhuǎn)換器實(shí)現(xiàn)方法,涉及C#基于WinForm操作圖片的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11