首页 > Asp.net开发 > WinForm开发框架–动态读取DLL模式

WinForm开发框架–动态读取DLL模式

之前的那个开发框架好几个朋友都用在了项目里面,也给我提出了很宝贵的意见,虽然最近一直没有什么更新,但是针对朋友们提出的建议,我都仔细考虑了一翻,很多的意见

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

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

这样一来也有一个问题,主程序的EXE越来越大,我觉得理论上是这样,所以最近忙里偷闲,将原来的那套框架重新整理了一下,主要有以下几个变化:

1.每一个窗体皆为一个类库,实现相应的接口。

2.用户打开窗体的时候不是直接Open窗体,而是加载DLL文件,读取DLL文件里面的信息。

3.每一个窗体所实现的业务仍然在自己的类文件中完成。

在新建的项目里面实现如下业务:

[csharp] view plaincopy

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

 

这里入去传入进来的DLL文件:

[csharp] view plaincopy

  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.                  if (string.IsNullOrEmpty(DllName))
  10.                      return;
  11.                  if (!allenSingleton.DicLoadDll.ContainsKey(DllName))
  12.                  {
  13.                      IPugins objLoadDll;
  14.                      if (allenSingleton.DicPugins.ContainsKey(DllName))
  15.                      {
  16.                          objLoadDll = allenSingleton.DicPugins[DllName];
  17.                      }
  18.                      else
  19.                      {
  20.                          objLoadDll = CPUtility.LoadDll(DllName);
  21.                      }
  22.                      if (objLoadDll != null)
  23.                          objLoadDll.Show(dockPanel, DockState.Document);
  24.                      allenSingleton.DicLoadDll.Add(DllName, objLoadDll);
  25.                  }
  26.                  else
  27.                  {
  28.                      allenSingleton.DicLoadDll[DllName].Activate();
  29.                  }
  30.              }
  31.              catch (Exception ex)
  32.              {
  33.                  ShowMsg(ex.Message);
  34.              }
  35.          }

 

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

 

大致效果图:

 

 

 

 

 


本文固定链接: http://www.devba.com/index.php/archives/999.html | 开发吧

报歉!评论已关闭.