國產系統大勢所趨,如果你公司的winform界面軟體需要在linux上運行,如果軟體是用C#開發的,現在我有一個好的快速解決方案。 世界第一的微軟的Microsoft Visual Studio,確實好用,C# 開發起來確實效率高,不過微軟的開發語言開發的軟體的界面都是跟windows系統綁定的,現 ...
國產系統大勢所趨,如果你公司的winform界面軟體需要在linux上運行,如果軟體是用C#開發的,現在我有一個好的快速解決方案。
世界第一的微軟的Microsoft Visual Studio,確實好用,C# 開發起來確實效率高,不過微軟的開發語言開發的軟體的界面都是跟windows系統綁定的,現在.net core已經支持linux系統了,但是不包含WindowDesktop,所以是不支持原生有界面的.net 軟體的,微軟語言的軟體界面所用的API基本都封裝在System.Windows.Forms.dll上了,所以用支持linux的工具重新開發System.Windows.Forms類庫就能讓C#軟體的界面在linux運行!
首先,必須是.net core 框架開發C#軟體的,工程框架要改成控制台,C#軟體升級開發框架也是很容易。其次,安裝GTK環境,基本是一鍵安裝完成。
最近機緣巧合,公司軟體需要移植上linux運行,研究後發現,軟體太複雜,開發了十幾年的軟體,重新開發工程量就很大,而且程式的複雜性都無法保證能移植成功。就突發奇想,如果把GTK表單控制項封裝成C#的控制項直接替換c#的原生表單控制項不就行了嗎?然後試了一下確實可以!而且能保留VS的原生可視化開發。目前已經實現了常用的表單控制項、容器、菜單、數據表、選擇器,先看效果:
封裝起來是很複雜的,GTK提供的是基礎組件,要把組件拆分重新組合成微軟原生控制項的組成結構,並且要實現相關的功能。 有些微軟的表單控制項GTK是沒有,需要自製,如掩碼輸入框、日期選擇框、選擇框列表,DataGridView是用GTK.TreeView來封裝實現的,很多控制項的賦值方法和數據源模式都不一樣,也需要改。我封裝的控制項都實現了C#原生控制項的常用屬性、事件、方法,以保證與原生程式相容。
需要說明一下,界面或工程資源文件的圖片資源在生成程式後是經過加密的,而微軟體圖像類和資源讀取方法類庫都是放在WindowDesktop庫上,控制台工程是沒有相關的類庫的,所以無法讀取。Form圖像處理有個麻煩的地方,界面有任何變動,Form.Designer圖像程式的讀程式都會自動更新為System.ComponentModel.ComponentResourceManager,所以自定義命名空間是不行的,一變動又要修正。
我的解決方法是自已寫System.Drawing.Image和System.Drawing.Bitmap,自寫System.ComponentModel.ComponentResourceManager類讀取圖片,把Form界面的xxx.resx源文件複製到一個文件夾內,直接當成XML文件來讀取,就能把裡面的圖像讀取出來,然後轉成byte[]數據傳給Bitmap。
在使用封裝好的引用的System.Windows.Forms.DLL時,還需要引用System.Resources.Extensions,這個在實現程式里用不上,但是VS開發需要,而且有些版本的還不行,會出錯,經過測試用.net core2的版本可以
最後,控制台框架開發是沒有界面的,而Form界面在控制台框架工程里預設也不能打開的,但是可以改配置來修正,只需要把obj目錄子目錄下找到xxxx.designer.runtimeconfig.json文件,把NetCore改成WindowDesktop即可,需要重啟VS,如下紅字
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.WindowsDesktop.App",
"version": "6.0.0"
},
然後就可以在控制台框架下愉快的開發表單界面了。