C/C++ 是電腦世界的共同語言。它速度快,又能直接與系統溝通,因此許多語言都能透過它來串接底層功能。有時候,也會將關鍵的程式邏輯用 C/C++ 寫好,只需實作一次,就能讓其他語言重複使用。
在 C# 中,串接 C/C++ 的方式有很多種。本次想記錄其中一種做法:透過 DllImport 讓 C# 呼叫原生函式。從使用 Visual Studio 編譯 C/C++ 程式碼成 DLL 開始,一步步到實際呼叫為止。如果手上已經有現成的 DLL 和對應的 .h 檔,也能藉此了解整個過程。
C/C++ 是電腦世界的共同語言。它速度快,又能直接與系統溝通,因此許多語言都能透過它來串接底層功能。有時候,也會將關鍵的程式邏輯用 C/C++ 寫好,只需實作一次,就能讓其他語言重複使用。
在 C# 中,串接 C/C++ 的方式有很多種。本次想記錄其中一種做法:透過 DllImport 讓 C# 呼叫原生函式。從使用 Visual Studio 編譯 C/C++ 程式碼成 DLL 開始,一步步到實際呼叫為止。如果手上已經有現成的 DLL 和對應的 .h 檔,也能藉此了解整個過程。
從以前的 .NET Framework 到現在最新的 .NET 框架,所編譯出的結果已經有些不同。以 .NET 框架的 WPF 專案為例,編譯後最少會生成一組 exe 執行檔與對應的 DLL 。
而現代程式在開發時,經常會使用各種套件或自行撰寫的類別庫來加快開發速度,所以使用的越多,編譯出來的執行檔旁邊的 DLL 檔也越多。
而在一些情況下,會將整個編譯輸出的資料夾壓縮後交付給使用者。不過,當檔案數量過多時,使用者在複製或移動時可能會遺漏,甚至誤刪必要的 DLL。若能將專案打包成單一執行檔,這些問題便能避免。
本篇將紀錄在 .NET WPF 專案中產生單一執行檔的可行方案之一,方便日後做參考。
在物件導向開發中,觀察者模式經常應用於模組化與封裝的設計中。它能讓物件以彈性的方式傳遞訊息,是實現鬆耦合的一種常見做法。
而在 C# 中,常用 event、Action/ Func、RX 等方式實作觀察者模式,看似達成了解耦。但實際上,訂閱者仍需知道事件來源,這造成一種隱性耦合,讓物件之間仍有依賴。
CommunityToolkit.Mvvm 套件中,除了提供 MVVM 架構下常用的 ObservableObject 與 ObservableValidator 外,還支援基於中介者模式的訊息傳遞機制 Messenger。
該機制讓訊息的發送者與觀察者無需彼此參照,只需註冊並透過 Messenger 發送訊息,就能由框架轉發給所有訂閱者。為了整合這套機制,套件也提供了 ObservableRecipient 類別,讓 ViewModel 更容易註冊與接收訊息。
這邊要注意的是,使用 Messenger 並不代表完全沒有耦合,而是將依賴轉向了中介物件 ( Messenger 本身),達成相對鬆耦合的設計。
本次將使用 WPF 並搭配 CommunityToolkit.Mvvm 套件的ObservableRecipient 物件與 Messenger 機制,實作訊息傳遞的示範。
MVVM 是 WPF 應用程式開發中的核心架構,透過 資料綁定 (Binding) 和 命令模式 (Command),讓 View 和 ViewModel 解耦,提高可維護性。
在使用過程中,個人最初從最基本的 一對一 關係開始學習,隨著專案需求變得更複雜,也開始嘗試 一對多、多對多,甚至多對一 的組合方式。這些不同的組合變化,某種程度上也反應了自己在 MVVM 架構上的成長,因此想記錄下這四種組合,作為經驗的整理。
ico 檔是 Windows 圖示的一種專用格式,能夠包含多種尺寸的圖片,方便系統根據不同情境自動選擇適合的圖示進行顯示。本次想記錄下使用 GIMP 軟體製作 ico 檔案,並將其應用於 WPF 應用程式中,整個過程並不困難,但因為不常用,時間久了可能會忘記,所以寫下來方便未來做個參考。