程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> WinForm開發框架--動態讀取DLL模式

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

編輯:C#入門知識

之前的那個開發框架好幾個朋友都用在了項目裡面,也給我提出了很寶貴的意見,雖然最近一直沒有什麼更新,但是針對朋友們提出的建議,我都仔細考慮了一翻,很多的意見

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

 

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

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

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

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

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

[csharp]  using System; 
 using System.Collections.Generic; 
 using System.Text; 
  
 using CP.Kernel.Base; 
  
 namespace sysUserGroup 
 { 
     [Serializable] 
     public class Plugins : IPugins 
     { 
         private FrmUserGroup f; 
         public void Activate() 
         { 
             f.Activate(); 
         } 
         public void Dispose() 
         { 
             f.Close(); 
             GC.Collect(); 
             GC.SuppressFinalize(this); 
         } 
         public void Hide() 
         { 
             f.Close(); 
         } 
  
         public string Name 
         { 
             get { return "角色資料設定"; } 
         } 
  
         public string GUID 
         { 
             get { return "F2080504B6DC4963BC0963FEFA0E1AAD"; } 
         } 
  
         public string Version 
         { 
             get { return "1.0.0.0"; } 
         } 
  
         public string Manufacturer 
         { 
             get { return "制造商"; } 
         } 
  
         public string Description 
         { 
             get { return "用於設定角色資料"; } 
         } 
  
         public string TCode 
         { 
             get { return "JSZL"; } 
         } 
  
         public string FrmUrl 
         { 
             get { return "sysUserGroup.dll"; } 
         } 
     } 
 } 

using System;
 using System.Collections.Generic;
 using System.Text;
 
 using CP.Kernel.Base;
 
 namespace sysUserGroup
 {
     [Serializable]
     public class Plugins : IPugins
     {
         private FrmUserGroup f;
         public void Activate()
         {
             f.Activate();
         }
         public void Dispose()
         {
             f.Close();
             GC.Collect();
             GC.SuppressFinalize(this);
         }
         public void Hide()
         {
             f.Close();
         }
 
         public string Name
         {
             get { return "角色資料設定"; }
         }
 
         public string GUID
         {
             get { return "F2080504B6DC4963BC0963FEFA0E1AAD"; }
         }
 
         public string Version
         {
             get { return "1.0.0.0"; }
         }
 
         public string Manufacturer
         {
             get { return "制造商"; }
         }
 
         public string Description
         {
             get { return "用於設定角色資料"; }
         }
 
         public string TCode
         {
             get { return "JSZL"; }
         }
 
         public string FrmUrl
         {
             get { return "sysUserGroup.dll"; }
         }
     }
 }

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

[csharp]  public void  LoadDLL(string DllName) 
         { 
             try 
             { 
                 if (DllName.Substring(DllName.Length - 4).ToUpper() == ".DLL") 
                 { 
                     DllName = DllName.Replace(".dll", ""); 
                 } 
  
                 if (string.IsNullOrEmpty(DllName)) 
                     return; 
  
                 if (!allenSingleton.DicLoadDll.ContainsKey(DllName)) 
                 { 
                     IPugins objLoadDll; 
                     if (allenSingleton.DicPugins.ContainsKey(DllName)) 
                     { 
                         objLoadDll = allenSingleton.DicPugins[DllName]; 
                     } 
                     else 
                     { 
                         objLoadDll = CPUtility.LoadDll(DllName); 
                     } 
  
                     if (objLoadDll != null) 
                         objLoadDll.Show(dockPanel, DockState.Document); 
  
                     allenSingleton.DicLoadDll.Add(DllName, objLoadDll); 
                 } 
                 else 
                 { 
                     allenSingleton.DicLoadDll[DllName].Activate(); 
                 } 
             } 
             catch (Exception ex) 
             { 
                 ShowMsg(ex.Message); 
             } 
  
  
         } 

public void  LoadDLL(string DllName)
         {
             try
             {
                 if (DllName.Substring(DllName.Length - 4).ToUpper() == ".DLL")
                 {
                     DllName = DllName.Replace(".dll", "");
                 }
 
                 if (string.IsNullOrEmpty(DllName))
                     return;
 
                 if (!allenSingleton.DicLoadDll.ContainsKey(DllName))
                 {
                     IPugins objLoadDll;
                     if (allenSingleton.DicPugins.ContainsKey(DllName))
                     {
                         objLoadDll = allenSingleton.DicPugins[DllName];
                     }
                     else
                     {
                         objLoadDll = CPUtility.LoadDll(DllName);
                     }
 
                     if (objLoadDll != null)
                         objLoadDll.Show(dockPanel, DockState.Document);
 
                     allenSingleton.DicLoadDll.Add(DllName, objLoadDll);
                 }
                 else
                 {
                     allenSingleton.DicLoadDll[DllName].Activate();
                 }
             }
             catch (Exception ex)
             {
                 ShowMsg(ex.Message);
             }
 
 
         }

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

 

 

\

大致效果圖:

 

\

\

 

\

\

 

\

 

\

 

\

\

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved