在 iThome 舉辦的 iTHelp 2025 鐵人賽當中發表了 "莫名其妙就跟世界等級的 OpenSource 專案攪和了!?" 系列文。
其中展示了:
- 在 Windows
- 在 Ubuntu (透過 WSL)
- 在 macOS
三種桌面環境中的 .NET 裝置端應用程式,並使用了 GStreamer 的技術來播放多媒體資訊,而其中 Samples 底下共有兩個專案。
一個是純 Console 的專案;一個是使用 Avalonia 的 UI 專案。
在該 GitHub 的 Repository 當中,其 Samples 內的兩個裝置端應用程式專案:

而無論是純 ConsoleSample 專案還是 AvaloniaPlayer 的 UI 專案,除了因為 GStreamer 能同時橫跨三種不同的作業系統使用外,也有賴於 .NET 在 .NET Core 3.0 後所推出的 "Native library loading (原生程式庫載入)" ,及借鏡了 mono 的 dllmap 設計處理。
透過 ConsoleSample 專案其中的 [Commit - c311615] 的異動比較能對照出其差異:

其中多了 NativeLibMapper.cs 跟 gstreamer-sharp.dll.config 這兩個檔案;而在 csproj 當中將 gstreamer-sharp.dll.config 設定為 EmbeddedResource。
AvaloniaPlayer 專案也有同樣的類似處理 [Commit - 3a2d739 ],只是該 Commit 多了一些其他跟此議題沒關係的調整。
所以如果沒什麼懸念,大概就可以猜到會透過 gstreamer-sharp.dll.config 去設定不同平台時所要讀取的資訊:

(其實這邊在 macOS 的 os 設定為 "osx" 是有點過時了,但就這樣吧!)
而 NativeLibMapper.cs 當中則是透過 NativeLibrary 處理讀取 "gstreamer-sharp.dll.config" 所設定的內容,並透過其值呼叫該平台的 Native Library 名稱:

在 NativeLibMapper.cs 當中還有一段因為 Windows 的 GStreamer 本身有 MinGW 跟 MSVC 版本的區別,所以特別處理了這部分:

這將能使透過 MSVC 版本所建置產生出來的 GStreamer-Sharp 的 Binding 程式庫 (dll),還能 "向下相容" 呼叫 MinGW 版本的 GStreamer。
向下相容的意思是說如果 Windows 還是仍是安裝 GStreamer 的 MinGW 版本的話,這兩個裝置端應用程式也都還是可以 "維持" 運作。
大致上 "載入各作業系統平臺的 GStreamer 執行時所需 Native Library 過程" 會如下圖概念所描述:

以上的設計則是效法在 "gstreamer-netcore" 本來就有設計到概念,並在進而調整設計在這兩個裝置端應用程式當中。
而 "gstreamer-sharp.dll.config" 的內容是 GStreamer-Sharp 在進行 Binding 的產生時會自動出現的一份 config 資料,但因為 GStreame-Sharp 若沒有去異動的話,就可能會有對照上的錯誤。
所以可能發現該平台的 GStreamer 的 Native Library 有異動時,就需手動調整 "gstreamer-sharp.dll.config" 的內容。
I'm a Microsoft MVP - Developer Technologies (From 2015 ~).

I focus on the following topics: Xamarin Technology, Azure, Mobile DevOps, and Microsoft EM+S.
If you want to know more about them, welcome to my website:
https://jamestsai.tw
本部落格文章之圖片相關後製處理皆透過 Techsmith 公司 所贊助其授權使用之 "Snagit" 與 "Snagit Editor" 軟體製作。