WinForm 開發框架【動態讀取DLL模式】


之前的那個開發框架好幾個朋友都用在了項目里面,也給我提出了很寶貴的意見,雖然最近一直沒有什么更新,但是針對朋友們提出的建議,我都仔細考慮了一翻,很多的意見我都融入了系統里面,將不足之處修改過來,本來想把報表的事兒給搞定,但是想了幾種方案結果都不了了之。曾經有一個朋友說很欣賞我那個讀取DLL文件的框架,以前我覺得寫得挺亂的,代碼也是比較混亂,有時候我自己翻出來居然要想很久才知道那些代碼是什么意思,當時之所以舍棄了這套框架,是因為覺得整個項目的Size會越來越大,因為每一個窗體都是一個類庫,然后編譯為DLL文件,程序去讀取並加載這些DLL文件,所以采取了直接寫在竹程序里面的方式,詳細介紹在這里:

http://www.cnblogs.com/allen0118/archive/2012/05/10/2494112.html

這樣一來也有一個問題,主程序的EXE越來越大,我覺得理論上是這樣,所以最近忙里偷閑,將原來的那套框架重新整理了一下,主要有以下幾個變化:

1.每一個窗體皆為一個類庫,實現相應的接口。

2.用戶打開窗體的時候不是直接Open窗體,而是加載DLL文件,讀取DLL文件里面的信息。

3.每一個窗體所實現的業務仍然在自己的類文件中完成。

4.只需要將生成的DLL文件放在指定的目錄,供程序讀取即可。

 

簡單的說明文檔

 

在新建的項目里面實現如下業務:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 using CP.Kernel.Base;
 6 
 7 namespace sysUserGroup
 8 {
 9     [Serializable]
10     public class Plugins : IPugins
11     {
12         private FrmUserGroup f;
13         public void Activate()
14         {
15             f.Activate();
16         }
17         public void Dispose()
18         {
19             f.Close();
20             GC.Collect();
21             GC.SuppressFinalize(this);
22         }
23         public void Hide()
24         {
25             f.Close();
26         }
27 
28         public string Name
29         {
30             get { return "角色資料設定"; }
31         }
32 
33         public string GUID
34         {
35             get { return "F2080504B6DC4963BC0963FEFA0E1AAD"; }
36         }
37 
38         public string Version
39         {
40             get { return "1.0.0.0"; }
41         }
42 
43         public string Manufacturer
44         {
45             get { return "制造商"; }
46         }
47 
48         public string Description
49         {
50             get { return "用於設定角色資料"; }
51         }
52 
53         public string TCode
54         {
55             get { return "JSZL"; }
56         }
57 
58         public string FrmUrl
59         {
60             get { return "sysUserGroup.dll"; }
61         }
62     }
63 }

這里入去傳入進來的DLL文件:

 1  public void  LoadDLL(string DllName)
 2         {
 3             try
 4             {
 5                 if (DllName.Substring(DllName.Length - 4).ToUpper() == ".DLL")
 6                 {
 7                     DllName = DllName.Replace(".dll", "");
 8                 }
 9 
10                 if (string.IsNullOrEmpty(DllName))
11                     return;
12 
13                 if (!allenSingleton.DicLoadDll.ContainsKey(DllName))
14                 {
15                     IPugins objLoadDll;
16                     if (allenSingleton.DicPugins.ContainsKey(DllName))
17                     {
18                         objLoadDll = allenSingleton.DicPugins[DllName];
19                     }
20                     else
21                     {
22                         objLoadDll = CPUtility.LoadDll(DllName);
23                     }
24 
25                     if (objLoadDll != null)
26                         objLoadDll.Show(dockPanel, DockState.Document);
27 
28                     allenSingleton.DicLoadDll.Add(DllName, objLoadDll);
29                 }
30                 else
31                 {
32                     allenSingleton.DicLoadDll[DllName].Activate();
33                 }
34             }
35             catch (Exception ex)
36             {
37                 ShowMsg(ex.Message);
38             }
39 
40 
41         }
42        

 這個框架比起之前的那一套,數據處理方面沒有什么變化,仍然采取存儲過程實現業務邏輯,程序里面基本上面看不到SQL語句;布局和風格也是沿用以前的做法,仍然是多文檔的布局模式,整體效果還是比較大方的,主要的變化就是核心部分,可以說現在的這套程序跟之前的那一套核心內容完全不一樣了,在耦合性方面也有一些改善。加載的窗體如下圖,都是DLL:

 

大致的效果:

 

 

多文檔布局模式預覽:

 

 

明天開始五一放長假10天,然后自己再接着請了幾天假,終於可以好好休息一下了,五一回來打算再好好優化一下,在這里祝大家五一愉快!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM