C#winform軟體移植上linux的秘密,用GTK開發System.Windows.Forms

来源:https://www.cnblogs.com/easywebfactory/archive/2023/07/06/17533040.html
-Advertisement-
Play Games

國產系統大勢所趨,如果你公司的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"
},

然後就可以在控制台框架下愉快的開發表單界面了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如何開發Java版人臉跟蹤應用?本篇給出了設計大綱,並解釋了相關的重要知識點 ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog ...
  • # 引言 最近做一個功能想要動態執行C#腳本,就是預先寫好代碼片段,在程式運行時去執行代碼段,比如像這樣(以下代碼為偽代碼): ```csharp string scriptText = "int a = 1;int b = 2; return a+b ;"; var result = Script ...
  • # Unity中的PostProcessScene:深入解析與實用案例 在Unity游戲開發中,我們經常需要對場景進行後處理,以實現更豐富的視覺效果。Unity提供了一個名為`PostProcessScene`的功能,可以讓我們在場景載入完成後,對場景進行一系列的處理。本文將詳細介紹`PostPro ...
  • IQueryable/IQueryable 和表達式樹 IQueryable有兩個組件 Expression:當前查詢的組件的與語言和數據源無關的表示形式,以表達式樹的形式表示。 Provider:LINQ 提供程式的實例,它知道如何將當前查詢具體化為一個值或一組值。 ![](https://img ...
  • 特性 跨平臺 Web API和MVC技術的統一 原生依賴的註入支持 更強的測試性 輕量、高性能的模塊 開源、有社區的支持 項目入口--Main Asp.Net Core應用程式最初作為控制台應用程式啟動,而Program.cs文件中的Main()方法就是入口 CreateHostBuilder()方 ...
  • ## 一:背景 ### 1. 講故事 很多朋友可能會有疑問,C# 是一門托管語言,怎麼可能會有非托管句柄泄露呢? 其實一旦 C# 程式與 C++ 語言交互之後,往往就會被後者拖入非托管泥潭,讓我們這些調試者被迫探究 `非托管領域問題`。 ## 二:非托管句柄泄露 ### 1. 測試案例 為了方便講述 ...
  • # Unity UGUI的所有組件的介紹及使用 本文將介紹Unity UGUI中的各個組件,包括它們的具體介紹、用途 ## 1. Text(文本) - 介紹:Text組件用於在UI界面上顯示文本內容。 - 用途:常用於顯示UI界面的標題、按鈕標簽、提示信息等。 ## 2. Image(圖片) - 介 ...
  • # Unity AssetPostprocessor中Model相關函數的實際應用 Unity AssetPostprocessor是Unity引擎中的一個重要功能,它可以在導入資源時自動一些腳本,以便對資源進行自定義處理。其中,Model相關的函數可以用於對導入的3D模型進行處理,包括修改模型的材 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...