.NET Blazor Hybrid app with MAUI 初體驗

看完 Daniel Roth 的 Youtube 影片,我動手做了一遍,然後寫了一點筆記,也錄製了一個實作練習的影片。

前言

之所以想試一下 Blazor Hybrid app,是因為我有一些已經運行十年以上的 Windows 應用程式,其中有的是商業軟體,客戶也還在使用。如果未來有機會把這些 Windows 應用程式改寫成跨平台的版本,在手機上面也能跑的話,那真是挺酷的啊!


如果你也有興趣玩一下 Blazor Hybrid app,可以看 Daniel Roth 的影片:ASP.NET Community Standup - Let's build an app with .NET MAUI and Blazor。我也只是看完影片之後依樣畫葫蘆做了一遍,然後再做第二遍、第三遍,最後再把「還算順暢」的練習過程錄下來,剪輯成影片。


我的影片是用 Movavi 錄製和剪輯,由於對這套剪輯軟體還不那麼熟悉,以至於最終成品有一點殘影和卡頓的現象。此外,影片中沒有旁白講解,我是以加註圖文的方式來替影片加上重點解說。無論如何,如果你想看看,可以點以下連結:


👉 Youtube 影片:Hello, Blazor Hybrid with NET MAUI

有關 Movavi 螢幕錄製結果出現殘影與卡頓現象的問題和解決方法,我已經寫在另一篇筆記:從 Camtasia 換成 Movavi


.NET 演進速度很快,當你看到我的影片時,說不定 MAUI 和 Blazor 又有了一些比較大的改變。文章的好處是可以隨意修改更新,所以我還是把一些筆記整理成文章,補影片的不足,且未來如果需要更新或補充也比較方便。


不過,這篇文章的實作步驟並沒有我的影片中示範的那樣複雜,二者主要差異是:影片中會示範如何讓 MAUI Blazor App 專案和 Blazor Server App 專案共用同一個 Razor Class Library 專案中的 UI 元件,這篇文章則是偏重於 Android 模擬器的相關事項。


閒話說得多了,進入正題吧。

Blazor Hybrid 簡介

Blazor Hybrid 技術的主要目的是結合 desktop app 和 web app 二者的優勢,例如將 desktop app 的其中一部份 UI 換成 Blazor(即 Web UI)。如此一來,UI 設計有了更大的彈性,同時又能存取裝置的原生功能與資源。


為了方便理解,可以粗略地把 Blazor Hybrid app 理解為「執行於此電腦或行動裝置的 Blazor Server app」。

關於 Blazor Hybrid 的幾個 facts:
  • 不涉及 WebAssembly 或 server endpoint。
  • 不涉及 browser sandbox,也就是說,Blazor Hybrid app 並不是執行於瀏覽器中。
  • Blazor Hybrid 可搭配三種口味的 UI 框架:MAUI、WPF、Windows Forms。Blazor 對這三種框架都有提供 BlazorWebView 控制項來呈現 Razor 元件。換言之,即使是老舊的 Windows Forms 應用程式,也能藉由 Blazor Hybrid 技術來添加新的 Web UI。
如果需要更詳細的介紹,可以讀一下微軟文件:ASP.NET Core Blazor Hybrid

練習

接下來的練習並未涉及程式撰寫,主要還是為了體驗一下 MAUI app 部署執行於 Windows 和 Android 裝置的過程。

我的作業環境與開發工具如下:
  • Windows 11 22H2
  • Visual Studio 2022 Preview (Version 17.3.0 Preview 2.0)
  • .NET SDK 6.0.400-preview.22301.10
  • .NET SDK 7.0.100-preview.5.22307.18

在動手練習之前,請先確定你的 Visual Studio 2022 有安裝 Blazor Hybrid App 的相關元件與專案範本。做法是開啟 Visual Studio Installer,修改安裝選項,確保其中的「.NET Multi-Platform App UI 開發」選項有打勾。如下圖:


接著開啟 Visual Studio 2022,建立專案時選擇 .NET MAUI Blazor App 範本。



一切採用預設值,專案名稱會是 MauiApp1。在不修改任何程式碼的情況下,先把程式執行起來看看。

執行於 Windows 平台

在 Visual Studio 執行應用程式時,有多種作業平台供我們選擇。先選擇「Windows Machine」,看看應用程式執行於 Windows 平台的樣子。


執行結果:


接著嘗試以 Android Emulator 來執行看看。

執行於 Android 模擬器

如果是第一次執行 Android 模擬器,會需要接受 Android 平台的相關授權條款。同意所有條款之後,會出現 Android 裝置管理員視窗,要求建立預設的 Android 裝置,如下圖:


點 Create 按鈕之後,會開啟 Android 裝置管理員,並下載裝置所需的檔案:


下載完成後,點一下「啟動」,如果看到如下圖的提示訊息,即表示你的 Windows 系統尚未安裝 Hyper-V 相關服務。



將目前的對話窗關閉,然後關閉 Visual Studio。接著按 Win 鍵,在搜尋框裡面輸入「Windows 功能」便可找到控制台的「開啟或關閉 Windows 功能」。進入此功能設定視窗後,參考下圖來安裝 Hyper-V 相關服務與元件。


安裝 Hyper-V 需要重新開機。完成後,再次開啟先前的 Visual Studio 專案,然後以 Android 模擬器執行。部署過程大約要等個幾分鐘,如果一切順利,應該就能看到如下圖的執行結果:



在專案已經完成編譯的情況下,從開始按 F5 直到出現上圖的畫面,我用馬錶測量的結果是大約花了 2 分鐘。

Android 模擬器相關設定

前面提過的 Android 裝置管理員,你也可以從 Visual Studio 的 Tools | Android 選單裡面找到:



上圖的 Android 選單裡面還有一個「Android SDK Manager」,點擊此項,便可管理目前已安裝的 Android SDK 版本和相關工具,如下圖。


注意圖中的視窗底部有個提示「1 Update Available」,顯示有新版本的 SDK 工具可以安裝,點一下即可進行更新。

Android 模擬器的加速器

我看到有些教學影片和文章說 Visual Studio 2022 的安裝選項裡面的「個別元件」裡面的「Intel Hardware Accelerated Execution Manager (HAXM) (本機安裝)」要打勾,如下圖:


但我的 Windows 環境沒有安裝此元件,依然可順利將 MAUI 應用程式執行於 Android 模擬器中。也許是因為我的機器有啟用 WHPX 的緣故?

關於 WHPX,微軟網站上有一份文件,標題是「Hyper-V & HAXM (模擬器效能的硬體加速)」,這裡摘錄其中一段文字:

下列虛擬化技術可用於加速 Android Emulator:
  1. Microsoft 的 Hyper-V 與 Windows Hypervisor 平台 (WHPX)。
    Hyper-V 是Windows虛擬化功能,可讓您在實體主機電腦上執行虛擬化的電腦系統。
  2. Intel Hardware Accelerated Execution Manager (HAXM)。
    HAXM 是執行 Intel CPU 之電腦的虛擬化引擎。
若要在 Windows 中擁有最佳體驗,建議您使用 WHPX 來加速 Android 模擬器。 如果您的電腦上沒有 WHPX,則可以使用 HAXM。 如果符合下列準則,Android Emulator 會自動使用硬體加速:
  • 您的開發電腦有提供並已啟用硬體加速。
  • 模擬器正在執行為 x86 型虛擬裝置建立的系統映像。


其中提到,「若要在 Windows 中擁有最佳體驗,建議您使用 WHPX 來加速 Android 模擬器。

Android 模擬器疑難雜症

練習過程中,我在 Android 模擬器的部分碰到了一些奇怪的問題。有時候,Android 模擬器的畫面全黑,不知道發生什麼事,只是反覆關閉模擬裝置再重新啟動,問題便消失了。


還有一個詭異的狀況:在 Visual Studio 中以 Android 模擬器來執行 MAUI app 時,會卡在部署程序,就像是進入無窮迴圈那樣。起初,我以為只是多等一會兒,也許三、五分鐘後,總會跑完,結果喝完一杯咖啡再回來看,依然還在跑:



微軟網站上面有一份文件:Android Emulator 疑難排解,裡面列出了十幾種狀況和排除方法,但似乎沒有一個跟我碰到的情況符合。


最終我是這樣解決的:從 Visual Studio 選單點選 Tools > Android > Android Device Manager,在此裝置管理員視窗中把目前唯一使用的裝置(Pixel 5 - API 31)刪除,然後重新建立一個相同的裝置。


重新建立 Android 裝置後,MAUI App 專案便又可以順利部署執行於 Android 模擬器了。

感想

做完這些練習,勉強算是稍微體驗了「寫一次,執行於各平台」的好處,只是我沒有蘋果手機和平板,目前也沒有強烈動機去測試 iOS 平台。


接下來,可以試著動手修改一些程式碼,讓它更接近實務上開發的專案:加入一個 Razor Component Library 專案來撰寫共用的程式碼和 UI 元件,並且在其他應用程式專案中使用那些共用元件,就像本文開頭提及的影片當中所示範的那樣。


然後,我得想一下手邊現有的 Windows Forms app,要先挑哪一個來動刀,以及要怎麼修改比較好:直接用 MAUI 把既有的 UI 全部改頭換面嗎?嗯,光用想的就覺得挺累。或者,運用 Blazor Hybrid 技術,在我的 Windows Forms 裡面內嵌網頁?恐怕還得再做一些實驗,才好判斷。

除此之外,每次部署程式到 Android 模擬器要花兩分多鐘的時間,似乎不是很有效率啊。看來硬體升級的日子也不遠了。

投資,都是投資啊。

延伸閱讀

沒有留言:

技術提供:Blogger.
回頂端⬆️