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天,然后自己再接着请了几天假,终于可以好好休息一下了,五一回来打算再好好优化一下,在这里祝大家五一愉快!

 

 

 

时间: 2024-10-14 19:28:54

WinForm 开发框架【动态读取DLL模式】的相关文章

读卡器-vs加载第三方动态库,调试模式能正常读取,但是单独执行exe,读卡出现问题!

问题描述 vs加载第三方动态库,调试模式能正常读取,但是单独执行exe,读卡出现问题! [DllImport("RWManager.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "ReadBase", SetLastError = true)] public static extern int dll_ReadBase(StringB

动态电用dll出错-动态调用Dll出错,服务模式

问题描述 动态调用Dll出错,服务模式 用MFC开发一个服务程序,服务程序在应用模式下,动态调用dll正常,然而变成服务模式,会导致服务停止.请问这是怎么回事,请大神指点. 解决方案 主要是你服务运行情况下,进程权限会变高,同时不能直接访问一些用户目录等.服务运行在SESSION0,这个可能会导致你的DLL处理有问题.你需要检查一下DLL的内部代码逻辑 解决方案二: http://www.cnblogs.com/duanshuiliu/archive/2012/07/05/2577402.htm

Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载

在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的,本篇文章主要介绍两种方式的动态加载,一个是对用户控件(UserControl)模块的动态加载,一个是对普通窗体(Form)的动态加载,通过这两种方式,我们有时候可以动态实现很丰富的界面效果. 1.用户控件(UserControl)模块在Tab控件中的动态加载 参考了很多CRM的系统,一般都是把CR

Winform开发框架之动态指定数据表

在Winform开发框架的应用中,大多数的时候,我们都是采用固定的表名作为操作数据表的对象,但有时候,有些特殊的需要,需要动态指定表的名称,如表名称可能和年份有关系或者和登录用户的身份有关系等等.本文介绍基于我的Winform开发框架,介绍如何动态构造表名,实现向不同表获取数据的操作实现. 例如:数据库中有一些客户信息的表(Customer),按照年份存储,都是Customer2012这样格式的表,每次调用的时候需要告诉Customer业务对象实际上去访问哪个Customer的表,比如Custo

Winform开发框架中实现同时兼容多种数据库类型处理

在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型.还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的. 在我较早期的一篇随笔<Winform开发框架

Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型.还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的.针对这两种情况,本文介绍在我的Winform开

Winform开发框架之通用定时服务管理

做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些可能是修改状态后再写回去,不管如何,这个都可以称之为数据同步操作,如人员信息同步.业务数据同步.第三方接口数据同步等等. 数据同步涉及到一个同步时间的问题,一般不敏感的数据,一天或者一周左右同步一次就可以了,有些可能需要间隔更短一点. 同步的逻辑不同,有些可能写数据库就可以了,有些可能需要访问WebService或者其他接口,然后在进行数据获取,保存等操作,回写的时候,也一般是调用WebService这样的接口修

Winform开发框架之通用定时服务管理2---如何开发定时服务应用

在上篇随笔<Winform开发框架之通用定时服务管理>介绍了我的框架体系中,通用定时服务管理模块的设计以及一些相关功能的展示.我们在做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些是双向的操作.这个定时操作(可能是间隔的时间,也可以能是定在某一个时刻,也可以能是让它在某天某时刻运行),那么这就需要定时服务程序来管理了,通常我们把他寄宿在Windows服务里面(这也是一种最佳的方式),这种方式最好的地方,就是它的生命周期可以随着电脑的启动而启动,而且很少需要用

Winform开发框架之通用附件管理模块

在做Winform项目的时候,一直有一个梦想,就是希望把所有的组件模块组合即可组装成一个完整的项目系统(或者至少可以大部分完成).这即使是梦想,我也一直为之奋斗,每前进一步,我们离梦想就靠近一步.因此,本着这个梦想,我一路走来,开发整理了一系列的组件模块,包括底层的公用类库.Winform分页控件.通用的适应多数据库的查询组件,以及相对高层次一点的组件模块:通用权限管理系统.通用字典管理模块.通用程序自动更新模块.以及本篇随笔介绍的通用附件管理模块,当然还会有更多的组件模块会吸引我继续朝着梦想前