博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm 开发框架【动态读取DLL模式】
阅读量:5160 次
发布时间:2019-06-13

本文共 3443 字,大约阅读时间需要 11 分钟。

之前的那个开发框架好几个朋友都用在了项目里面,也给我提出了很宝贵的意见,虽然最近一直没有什么更新,但是针对朋友们提出的建议,我都仔细考虑了一翻,很多的意见我都融入了系统里面,将不足之处修改过来,本来想把报表的事儿给搞定,但是想了几种方案结果都不了了之。曾经有一个朋友说很欣赏我那个读取DLL文件的框架,以前我觉得写得挺乱的,代码也是比较混乱,有时候我自己翻出来居然要想很久才知道那些代码是什么意思,当时之所以舍弃了这套框架,是因为觉得整个项目的Size会越来越大,因为每一个窗体都是一个类库,然后编译为DLL文件,程序去读取并加载这些DLL文件,所以采取了直接写在竹程序里面的方式,详细介绍在这里:

这样一来也有一个问题,主程序的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 : IPugins11     {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 Name29         {30             get { return "角色资料设定"; }31         }32 33         public string GUID34         {35             get { return "F2080504B6DC4963BC0963FEFA0E1AAD"; }36         }37 38         public string Version39         {40             get { return "1.0.0.0"; }41         }42 43         public string Manufacturer44         {45             get { return "制造商"; }46         }47 48         public string Description49         {50             get { return "用于设定角色资料"; }51         }52 53         public string TCode54         {55             get { return "JSZL"; }56         }57 58         public string FrmUrl59         {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                     else21                     {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                 else31                 {32                     allenSingleton.DicLoadDll[DllName].Activate();33                 }34             }35             catch (Exception ex)36             {37                 ShowMsg(ex.Message);38             }39 40 41         }42

 这个框架比起之前的那一套,数据处理方面没有什么变化,仍然采取存储过程实现业务逻辑,程序里面基本上面看不到SQL语句;布局和风格也是沿用以前的做法,仍然是多文档的布局模式,整体效果还是比较大方的,主要的变化就是核心部分,可以说现在的这套程序跟之前的那一套核心内容完全不一样了,在耦合性方面也有一些改善。加载的窗体如下图,都是DLL:

 

大致的效果:

 

 

多文档布局模式预览:

 

 

明天开始五一放长假10天,然后自己再接着请了几天假,终于可以好好休息一下了,五一回来打算再好好优化一下,在这里祝大家五一愉快!

 

 

 

转载于:https://www.cnblogs.com/allen0118/archive/2013/04/26/3045303.html

你可能感兴趣的文章
Android 学习 豆瓣学习 sd卡缓存 内存缓存 下拉刷新 日志编辑等
查看>>
如何配置git send-email相关的邮箱信息?
查看>>
bzoj 4774: 修路
查看>>
转载--php 7.2 安装 mcrypt 扩展
查看>>
使用JUnit测试预期异常
查看>>
HDU5523 Game
查看>>
如何安装pip
查看>>
WCF完美搭建android平台服务之一
查看>>
ResNet笔记
查看>>
数据结构化与保存
查看>>
Facebook Error Code 901
查看>>
C#设计模式之11:命令模式
查看>>
使按钮失效的方法
查看>>
【娱乐】检查你的电脑是“男人”还是“女人”
查看>>
MySQL的system命令在渗透测试中的使用以及UDF提权
查看>>
node,js开发环境的搭建
查看>>
第25月第11天 deeplearning.ai
查看>>
hdu 2117
查看>>
Hibernate查询
查看>>
hive 定时加载分区
查看>>