Ligg.EasyWinApp-000: 一款Windows應用編程框架介紹

来源:https://www.cnblogs.com/liggin2019/archive/2019/11/02/11780431.html
-Advertisement-
Play Games

本解決方案是一個Windows應用編程框架和UI庫,包括四個項目: Ligg.EasyWinForm是一個Winform應用編程框架和UI庫。通過這個該框架,不需任何代碼,通過XML配置文件,搭建任意複雜的Windows應用界面,以類似Execel公式的方式實現基本的過程式控制制(賦值、條件判斷、迴圈、 ...


 本解決方案是一個Windows應用編程框架和UI庫,包括四個項目:

  •   Ligg.EasyWinForm是一個Winform應用編程框架和UI庫。通過這個該框架,不需任何代碼,通過XML配置文件,搭建任意複雜的Windows應用界面,以類似Execel公式的方式實現基本的過程式控制制(賦值、條件判斷、迴圈、跳轉)和功能(字元處理、文件處理、Windows腳本執行、邏輯運算、數學運算、數據輸入輸出-支持String、Jonson、DataTable類型的數據);動態載入“即插即用“的.Net組件或COM組件實現特定的業務處理功能;支持多線程、多語言。
  •  Ligg.EasyWinConsole是一個Windows控制台應用編程框架,與Ligg.EasyWinform相似,不需任何代碼,配合參數傳入及鍵盤輸入;通過配置文件,以類似Execel公式的方式實現基本的過程式控制制和功能,通過動態載入“即插即用“的.Net組件或COM組件實現特定的業務處理功能。
  • Ligg.EasyWinService是一個基於Windows服務的應用編程框架,通過配置文件, 定義啟動/關閉、即時/定時/迴圈運行的作業,動態載入“即插即用“的.Net組件或COM組件實現特定的業務處理功能。實現只需一個Windows服務、一個配置文件,(同時)實現不同的業務場景下的不同的功能。
  •   Ligg.EasyWinSignalR是一個基於windows的SignalR客戶端應用編程框架,一個單用戶對多台機器的即時通訊工具,內建基本功能如聊天、傳送接收文件、截屏等。動態載入“即插即用“的.Net組件或COM組件實現特定的業務處理功能。可以用作運維自動化的代理實現電腦的實時監控和運維。

 

項目程式運行結構圖

 

**說明SeqExec.exe是一個C編寫的.net程式的啟動程式,用於檢測.net版本並安裝指定的版本,然後運行主執行程式並傳遞參數。(代碼和示例詳見:https://www.github.com/liggin2019/Ligg.SeqExec)

 

本框架的來源

      先來說說本框架的來源:

      還是VC1.5時代,本人被“國家分配”至某研究所,擔任“軟體工程師”,有幸加入某“鐵道用制票檢票機項目”,開始了程式狗的生涯。當時為了配合硬體工程師調試樣機,需要用C寫大量的測試用例(界面)調用inport()、outport()來做測試。剛開始任勞任怨第每天Copy/Paste,後來一想不對,於是偷懶,按不同測試類型用不同的.ini文件做了一個界面生成器,有新的測試,就只需要Copy一下.ini文件,改一下參數就行了。最後這個任務就交給硬體工程師自己做了。這算是這個框架的萌芽吧。

      後來在.net2.0時代,在某電子公司任職時,恰逢公司引進某先進的“視覺檢測設備”。但是公司的需求與設備有一些不一致的地方(簽合同時並沒有搞清楚),要求供應商修改主程式(其實就是界面和某些運行參數),被告知一個天價;於是從總部請來了軟體工程師和硬體工程師決定對該設備進行改造。在與軟體工程師進行本專業的友好交流時,被強行拉入這個“視覺檢測設備”的引進和改造項目。供應商也許出於內疚,破天荒提供了基於OPC協議的COM介面程式, 於是總部軟體工程師負責介面程式的編寫,本人負責界面程式---通過配置文件實現一系列測試界面進行設備調試和校勘;最後做了一個外置的界面實現非常規的項目檢測;這算是這個框架的出生元年吧。

      轉眼到了.net4.0時代,本人在某包裝公司任職,集團決策層崇歐尚美,一直走在實踐國際化企業管理理論的前列。躬逢其盛,在本人入職的第二年公司同時落地ISMS和ITIL項目。政策和流程文件多達幾百頁,但是,所有流程在伺服器和用戶端電腦上的操作如監控/巡檢/配置/部署等是需要手工或半手工(寫點腳本)進行的,而且其中2個異地工廠(也有幾台伺服器和幾十臺用戶端電腦)是沒有專職IT人員的,分別由一位財務大姐和一位電工兄弟兼職!!多次提議上一個HP/DELL/MS的運維自動化系統,管理層置之不理。眼看運維組的兄弟要一個個辭職了,某天晚上突然醍醐灌頂,意識到所有的這些手工或半手工的操作不就是對文件、註冊表、主策略、用戶用戶組的處理還有軟體安裝/卸載、網路/資料庫/電腦性能檢測這些操作嗎?這些都可以程式實現,繁瑣的事只不過是要移步到每臺電腦,做大量的手指重覆的敲鍵盤的動作而已。何不利用以前的程式框架做一個運維自動化系統,讓運維兄弟們足不出戶,通過預先設置、一次敲滑鼠,批量完成這些重覆動作,甚至可以從一鍵完成到通過Windows服務自動完成,通過SignalR編程實時遠程完成?說乾就乾,當天凌晨畫了需求框架,然後請假一周,一周後初步完成就拿去救火,這算是這個框架的1.0版本吧。

      後來再把這套框架拿來做了公司的HR系統、MES系統,算是這個框架的2.0版本。

      後來有一個軟體公司做開發總監的朋友,看了這個東西後,覺得特別適合他們做軟體測試,於是就拿給他們試用。參考他們的反饋和建議,反覆迭代、修改----抽象、解耦、提純,就演變成了今天的共用給大家的這個東西。算是這個框架的3.0版本。

      另外我會把那個運維自動化系統匹配到最新版本的框架,寫成另外一個專題“Windows運維自動化編程實戰”,也會陸續分享給大家。

 

本框架的特點

1. 界面和基本的過程式控制制通過配置實現,把程式員從繁瑣重覆的勞動中解放出來,提高開發效率,縮短開發周期。適用於所有.net開發人員和組織。

    EasyWinForm完全可以高仿 SAP GUI、SEP客戶端、360安全衛士客戶端的界面,並且是完全通過配置文件實現。.net的Winform的拖拉控制項上手很快,但是要實現一些複雜的東西還是需要一些奇巧淫技的,比如象360的所有Windows客戶端產品點關閉的Control Box只是最小化、彈出一個非視窗的對話框、隱藏/顯示(切換)一側的區域等等。即使對於一個Winform的熟手,在修改或拷貝一個多層繼承帶有Resource的的窗體時,一不小心就會報各種莫名其妙的錯誤,這個對Winform的開發人員來說應該是深有體會的。如果使用EasyWinForm,所有的界面元素完全是通過XML文件實現,這個工作交給一個IT文員來做是完全可以勝任的,核心工程師只需要把精力放到實現業務邏輯的代碼上去就行了;並且EasyWinForm自帶了類似Excel公式的基本的過程式控制制和基本運算/處理函數,業務邏輯的代碼可以寫的非常簡潔,可以說核心工程師只需要寫“核心”業務代碼就行了。

2. 前端和後端完全分離,真正實現松耦合、後綁定輕鬆應對需求多變的場景,特別適合軟體測試、嵌入式設備開發調試、需求階段的原型設計等應用。

    不管系統架構是怎樣的(連接嵌入式設備、直連資料庫或伺服器+客戶端形式),由於界面和基本的過程式控制制完全靠配置來實現,框架後端採用動態載入“即插即用“的.Net組件(核心業務邏輯處理-CBLP組件)形式,前後端就完全實現瞭解耦。在需求多變、需求不清晰的情況下特別適用。比如一個ERP系統,MRP運算、複式記賬法這種公式定理一樣的東西,把它寫在CBLP組件里,做到千年不變;變的只是流程、場景、可視化的一些東西,這些可以把它放到前端、通過配置實現就可以了。再比如我們即將介紹的運維自動化系統,把對文件、註冊表、主策略、用戶用戶組的處理還有軟體安裝/卸載、網路/資料庫/電腦性能檢測寫在CBLP組件里,變的部分如:今天管理員密碼修改為abcd,明天修改為1234、註冊表裡WSUS伺服器地址要緊急改動、明天ISMS政策又增加了對屏保的管理、由於專線中斷臨時修改所有電腦的host文件、需要臨時清查盜版軟體等等,這些在EasyWinForm里通過配置增加一個表單,或在EasyWinService里增加一個Procedure就可以搞定了。對於這些變更,根本不需程式員出手。

3. 支持多文化、多語言,適合跨國公司管理系統作為開發框架使用。

    在.\applications\App-n\Cultures\ Cultures.xml做一個設置和不同級別的Annexes.xml里按語言增加條目,所有與用戶交互的元素都會按語言顯示相應文字。.

 

致謝

    首先感謝這個時代和互聯網;

    感謝博客園以及CSDNgithubstackoverflowsourceforgegiteecodeproject、codeplex 等開源共用平臺,使我們只需一條網線、一臺電腦就可以操習並精進一門技藝,籍以安身立命、養家糊口;

    感謝 張善友Jeffrey Su廖雪峰梁桐銘依樂祝伍華聰小坦克黃燈橋蔣金楠周金根軟體教書匠金旭亮老趙靈感之源程式員鄒欣周金橋瀚海潛游玩家雲風tinyfoolruanyf; 你們開放真誠的分享就像陽光雨露,滋養著這顆禾苗,讓我們懷著感恩的心生根發芽,開花結果。

    感謝使用本框架的同事、朋友、用戶,對你們寶貴的建議我大部分在最新版本里做了修訂。

    特別感謝csharpwin,雖然你的站點已經停止運營,但是你曾經分享的關於Winform方面的知識和經驗對本框架形成起了很大作用,在此向你表示衷心的感謝,並致以崇高敬意和美好祝福!

    感恩前人慷慨的分享,回饋先賢智慧的引領;本人將把本框架以“一絲不掛”的姿勢赤裸呈現給大家。

    開源精神永遠不死!!

結語

    本人雖然是一個老程式員,但是由於大部分時間是在企業從事管理系統和基礎設施的規劃、應用、實施等工作,專職開發編碼的時間並不長,所以謬誤之處在所難免,懇請大家在評論區多反饋並出提寶貴意見。

 

以下將分幾個章節來介紹設計思路和分析源碼:

Ligg.EasyWinForm:一款Winform應用編程框架和UI庫介紹

Ligg.EasyWinConsole:一款Windows控制台應用編程框架介紹

Ligg.EasyWinService:一款Windows服務應用編程框架介紹

Ligg.EasyWinSignalR:一款基於WindowsSignalR客戶端應用編程框架介紹

 

 

 

 

源碼和測試用例請至https://www.github.com/liggin2019/Ligg.EasyWinApp訪問。(目前只有Ligg.EasyWinForm的源碼和demo,其他項目將陸續完善並上傳)


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

-Advertisement-
Play Games
更多相關文章
  • 眾所周知,在組件式開發中,最大的痛點就在於組件之間的通信。在 Vue 中,Vue 提供了各種各樣的組件通信方式,從基礎的 props/$emit 到用於兄弟組件通信的 EventBus,再到用於全局數據管理的 Vuex。 在這麼多的組件通信方式中,provide/inject 顯得十分阿卡林(毫無存 ...
  • var myDate = new Date();Date.now(); // 獲取當前時間 1573200670754 時間戳精確到毫秒 myDate.getYear(); //獲取當前年份(2位) myDate.getFullYear(); //獲取完整的年份(4位,2017) myDate.ge ...
  • 本節說一下DOM操作模塊里的刪除元素模塊,該模塊用於刪除DOM里的某個節點,也可以理解為將該節點從DOM樹中卸載掉,如果該節點有綁定事件,我們可以選擇保留或刪除這些事件,刪除元素的介面有如下三個: empty() ;移除匹配元素的所有子元素。 ;先移除所有後代元素關聯的數據和事件,以避免記憶體泄漏。然 ...
  • CSS的引入 在早期,如果要去定義一個H1的標題的顏色、字體、大小和其他的顯示特征,就需要用到HTML中的font或其他樣式的指令,H1只是一個結構指令所以光有它是不夠的。因此如果有多個標簽要去進行處理,就會造成樣式的重覆,後期維護的困難。 那CSS的出現就解決了這一類的問題,CSS(Cascadi ...
  • GoF設計模式一共有23個。一般可以按目的和作用範圍來進行劃分,具體劃分方法如下: 第一,這些模式按目的(即完成什麼樣任務)來劃分為創建型、結構型和行為型這三種模式: 創建型:用來創建對象。單例、原型、抽象工廠、建造者、工廠方法這五個都屬於這一分類。這種類別起到了將對象的創建與其使用進行分離解耦。 ...
  • 重構改善既有代碼 第一次做某件事情的時候儘管去做,第二次做類似的事會產生反感,第三次再做類似的事,你就應該重構。 小型函數優美動人 一個類最好是常量類,任何的改變都是調用該類本身的介面實現。 0 壞代碼的味道 1、重覆代碼 Duplicated Code 同一類中的兩個函數含有相同的表達式,提取到方 ...
  • 0 簡單工廠模式 0.0 簡單工廠模式動機 考慮一個簡單的軟體應用場景,一個軟體系統可提供多個外觀不同按鈕(如圓形、矩形按、菱形按鈕等), 這些按鈕都源自同一個父類,不過在繼承父類後不同的子類修改了部分屬性從而使得它們可呈現不同外觀,如果希望在使用這些按鈕時,不需要知道這些具體按鈕類的名字,只需要知 ...
  • 要想理解持續集成和持續部署,先要瞭解它的部分組成,以及各個組成部分之間的關係。下麵這張圖是我見過的最簡潔、清晰的持續部署和集成的關係圖。 "圖片來源" 持續部署: 如圖所示,開發的流程是這樣的: 程式員從源碼庫(Source Control)中下載源代碼,編寫程式,完成後提交代碼到源碼庫,持續集成( ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...