iTimothy

君看一叶舟,出没风波里


  • 首页

  • 分类

  • 归档

  • 项目

  • 关于

Dynamic Plugins Manager (二) 配置及实现分析

发表于 2008-03-29 | 分类于 我的拙作 | | 阅读次数:
字数统计: 729 字 | 阅读时长 ≈ 2 分钟

整个Plugins Manager是一个基于dll的程序集,开发平台,基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢?没别的原因,只要是为了尝试一下Linq to XML [cool]

使用改组件,需要在应用程序中,添加引用。另外,还需要在应用程序中,建立相关的配置项:

[code]

[/code]

PluginsPath是插件的主目录,里面通过子目录的方式,存放不同的插件。Plugins Manager在启动的时候,会遍历插件主目录,并搜寻可加载的插件。

LogPath是插件的日志目录,里面的日志文件,会详细记载插件管理器当前的运行情况。

另外,在Plugins Manager中,区别不同的插件,是根据不同的插件名称来决定的,这取决于插件dll的命名。 对于不同的插件,Plugins Manager也提供不同的特性配置文件。配置文件是.xml文件,命名需要和插件dll相一致。 下面是一个配置文件的示例: [code]

Component.Class1 True

D:\MyCode\C# Projects\DynamicPlugInsApp\ITestInterface\bin\Debug\ITestInterface.dll

[/code]

TypeName:插件的类名,和具体的插件命名空间和类名有关,Plugins Manager根据配置文件提供此相关信息,通过.NET的反射技术,生成具体的插件Instance EnablePlugin:插件开关,True表示当前插件可用,False表示阻止Plugins Manager加载此插件。该开关可以在Plugins Manager运行前设定,也可以在Plugins Manager运行时动态更改。Plugins Manager会检测配置文件变化,并留意EnablePlugin开关,以决定是否动态加载或者卸载该插件。 ConstructParams:此节点,及其子节点,用以读取插件是否需要在运行时初始化构造函数。子节点用以描述构造函数中的参数,以及类型,和初始化的值。构造初始化函数,也是在.NET的反射中实现。这里要注意,节点顺序和构造函数参数顺序有关。如果插件不需要构造函数,可以关闭此节点。 ReferenceList:此节点用以需要动态编译的插件,如果插件代码中还引用了其他的程序集,需要在此进行描述。

此外,插件还提供了事件通知功能,供应用程序进行响应和处理,实现的事件类型有以下几种:

[code] public enum PluginEventType { PluginLoadOver, //所有插件加载完毕 PluginAdded, //插件新增完毕 PluginRemoved, //插件卸载完毕 PluginStopped, //插件管理器已停止 PluginStarted //插件管理器已启动 } [/code]

插件的事件参数定义如下,只包含简单的事件类型和文本描述:

[code]
public class PluginEventArgs : EventArgs
{
    #region Private Members
    public PluginEventType EventType { get; set; }
    public string EventMessage { get; set; }
    #endregion

    public PluginEventArgs(PluginEventType eventtype, string message)
    {
        EventType = eventtype;
        EventMessage = message;
    }

}

[/code]

以上是使用该插件,需要配置的地方,下一篇日志,将演示该插件的Demo.

Dynamic Plugins Manager (一) 介绍

发表于 2008-03-29 | 分类于 我的拙作 | | 阅读次数:
字数统计: 1.1k 字 | 阅读时长 ≈ 3 分钟

Dynamic Plugins Manager是一个基于.NET的动态插件管理组件,也是我在业余时间做的一个小东东,代码在07年底就开始动工,因为一直没充裕时间完成,趁这个周末休息,加班加点的Coding,出来了一个原型,估计里面还有很多的显而易见的以及隐而未现的bug。 设计这个组件的初衷,是为了能方便的应用于今后的项目中。先进的企业级项目中,变化最为突出的,还是业务,业务的变化,直接导致编码中业务逻辑代码的变化。如果将这些业务逻辑混杂在一起,业务的变化,最终会导致代码的混乱,甚至难以维护。这对于一个长期迭代的项目来说,是相当痛苦的事。就像直接拿一个成千上万行的代码给开发人员,估计开发人员不是晕厥,就是吐血。而一个难以维护的业务逻辑代码,对于每一次迭代,都是一次冒险。很可能在某次的迭代中,会对以前的业务逻辑,产生影响或者风险。 对于复杂的业务逻辑,需要进行重构,并且将不断变化的业务逻辑,抽离出来。比较折中的方法,就是将这些变化的逻辑,做成独立的插件形式。这样一来,独立的业务,在物理上进行了分离。开发人员也不用担心修改某处业务逻辑,会影响其他的业务模块。而动态的插件管理形式,对后期维护也带来益处,独立的业务逻辑插件之间,不会相互影响。开发人员还可以在程序运行而又不影响业务的情况下,动态的发布、替换原有的业务逻辑模块。 Dynamic Plugins Manager(以下简称Plugins Manager),也就是按照这样的思路和需求来设计的,其实现的功能,具体有一下几个特点: 1.所有的插件,都以DLL程序集的方式发布,Plugins Manager在启动的时候,搜索加载所有可加载的插件并进行加载 2.Plugins Manager,支持插件的动态卸载功能。借助于AppDomain的特性,所有的组件,在动态加载后,可以动态从内存中卸载。插件的实现,需要继承自MarshalByRefObject。 3.与接口无依赖性,Plugins Manager负责插件的管理、动态加载、动态卸载、调用。但是和具体的插件接口无关,这样一来,开发人员可以定义自己的插件接口,并开发不同的插件实现接口。 4.插件可以动态发布和卸载,Plugins Manager会监视当前目录中,插件的变化,对于以xcopy方式,拷贝入插件目录的插件,可以进行动态加载。对于插件的卸载,可以Plugins Manager提供的接口进行动态卸载,也可以实时更改插件配置文件中的具体开关进行卸载。 5.动态编译功能:Plugins Manager允许直接发布插件代码。通过读取插件配置文件中的引用信息,可以直接从代码生成dll插件,并加载。 6.允许插件实现不同的构造函数重载,并将构造函数参数以及值信息,定义在插件配置文件中。Plugins Manager在加载插件的时候,采用配置文件中的值,调用相应的构造函数,并加载插件。 7.事件通知:Plugins Manager在不同的插件操作完成后,会触发相应的事件机制,通知客户端程序进行相应的处理

插件的结构一览:

PluginsManager:插件管理类,实现插件功能的主要代码逻辑,以及对插件容器的维护 AssemblyLoader:插件加载类,实现从AppDomain加载插件的逻辑 PluginEntity:插件实体类,包含插件的信息(插件实例、插件名称……) AssemblyFactory:插件生成类,实现从插件代码生成dll的功能

下一篇日志中,将会介绍这个插件的具体配置,及简单分析其实现。

Dynamic Plugins Manager

发表于 2008-03-29 | 分类于 我的拙作 | | 阅读次数:
字数统计: 75 字 | 阅读时长 ≈ 1 分钟

Dynamic Plugins Manager (一) 介绍 https://xiaozhou.net/article.asp?id=187

Dynamic Plugins Manager (二) 配置及实现分析 https://xiaozhou.net/article.asp?id=188

Dynamic Plugins Manager (三) Demo https://xiaozhou.net/article.asp?id=189

Dynamic Plugins Manager (四) 插件及Demo源码下载 https://xiaozhou.net/article.asp?id=190

Dynamic Plugins Manager (五) Plugins Manager 源码下载 https://xiaozhou.net/article.asp?id=191

迟来的照片–洛带游记

发表于 2008-01-05 | 分类于 随笔 | | 阅读次数:
字数统计: 121 字 | 阅读时长 ≈ 1 分钟

来公司后,和同事们的第一次出行,目的地定在古镇洛带。同学们积极性都很高,在一个周六的早上,相约出发,在目的地会合。游古城,啃玉米,爬长城,晚上又一起唱歌,很是尽兴。因为有同事即将离开成都去重庆开展项目。

发几张照片留念

集体照

长城上

著名的伤心凉粉

摆造型

更多的照片,看相册哦 [cool]

Merry Christmas

发表于 2007-12-23 | 分类于 随笔 | | 阅读次数:
字数统计: 831 字 | 阅读时长 ≈ 2 分钟

https://xiaozhou.net/music/silentnight.mp3

又到一年圣诞之时,祝大家圣诞快乐。

介绍一下圣诞节的来历~~~

教会开始并无圣诞节,约在耶稣升天后百余年内才有。据说:第一个圣诞节是在公元138年,由罗马主教圣克里门倡议举行。而教会史载第一个圣诞节则在公元336年。由于圣经未明记耶稣生于何时,故各地圣诞节日期各异。直到公元440年,才由罗马教廷定12月25日为圣诞节。公元1607年,世界各地教会领袖在伯利恒聚会,进一步予以确定,从此世界大多数的基督徒均以12月25日为圣诞节。其实哪一天并不要紧,重要的是应该知道它是为纪念救主耶稣降生。由于圣经记载耶稣生于夜间,故传统称12月24日夜为”圣诞夜”或”平安夜”。

耶稣的降生,有旧约先知预言:”必有童女怀孕生子,给他起名叫以马内利(意思为’上帝与我们同在’)。”(以赛亚书7章14节,圣经下同)

耶稣降生时,有天使报信:”不要惧怕,我给你们大喜的信息,是关乎万民的;因今天在大卫的城里,为你们生了救主,就是主基督。你们要看见一个婴孩,包着布,卧在马槽里,那就是记号了。”(路加福音2章10-12节)

耶稣降生时,有博士朝拜,”他们看见那星就大大地欢喜。进了房子,看见小孩子和他母亲马利亚,就俯伏拜那小孩子,揭开宝盒,手拿黄金、乳香、没药为礼物献给他。”(马太福音2章10-11节)

耶稣,意指”上帝拯救”,因为圣经说:”世人都犯了罪,亏缺了上帝的荣耀。”(罗马书3章23节)罪使人离开生命的源头,宇宙万物的主宰。罪使人失去公义、仁爱,变得自私、骄傲、贪婪、邪恶。罪破坏人与上帝、人与人之间和睦的关系,使人活在无可奈何的痛苦之中。罪使人将来要面对永远的刑罚和痛苦,”人人都有一死,死后且有审判。”(希伯来书9章27节)因为上帝是圣洁、公义的!

但是,上帝又是慈爱的主,他赐给世人自己的独生子–耶稣基督,成为人的样式(就是圣诞),作我们的救赎主,他要将自己的百姓从罪恶里救出来。(马太福音1章21节)他代替了我们的软弱,担当了我们的罪的刑罚。”上帝使我们众人的罪孽都归到他身上”,(以赛亚书53章6节)为我们的罪钉死在十字架上。

今天,只要你悔改自己的罪,相信他,接受他做你个人的救主,你的罪就被赦免了,你与上帝就恢复了那起初和睦的关系,你就得了永远的生命。今天你接受耶稣在你的心里,今天就是你的圣诞节,愿上帝今年赐给你一个特别的圣诞节!

在至高之处荣耀归与神,在地上平安归与祂所喜悦的人。【圣经 路加福音 2:14】

意外

发表于 2007-12-23 | 分类于 随笔 | | 阅读次数:
字数统计: 87 字 | 阅读时长 ≈ 1 分钟

很久没来博客写点什么了,前几天才发现网站出现问题了,查了查原因,原来是数据库文件格式损坏。更遭的是最近忘了备份,机器上的备份已经是一个月前的了,所以有几篇日志掉了 [cry] 教训啊,看来要勤备份才行。

汉语编程 偶也来恶搞一把

发表于 2007-11-03 | 分类于 技术控 | | 阅读次数:
字数统计: 214 字 | 阅读时长 ≈ 1 分钟

这几天的热门话题,要属汉语编程了。一直以来,汉语编程,就一直成为争议的话题。其实偶更倾向于英文代码,中文的代码,看起来确实比较别扭。其实VS2005支持双字节,也支持中文。所以偶们也来搞恶一把,Let’s do it!!

[code]

#include “常用头文件”

整形变量 主函数入口(整形变量 参数个数, 字符指针 字符参数数组) { 整形变量 某某某 = 6 呀 某某某 = 某某某 减去 1呀 如果(某某某 等于 5) { 输出(“某某某本来为6,减去1 果然等于”); 输出(“%d\n”,某某某); } 函数返回 0 呀 } [/code]

运行效果:

其实没什么秘密,答案就在头文件里面 代码大家下载了看吧。呵呵。

点击下载此文件

相册开通了 :-)

发表于 2007-10-22 | 分类于 随笔 | | 阅读次数:
字数统计: 69 字 | 阅读时长 ≈ 1 分钟

偶然在网上发现了一个非常酷的flash相册–ImageVue(官方网站),Imagevue是一款基于普遍应用的PHP和Flash的相册程序,而且效果是非常的炫。于是自己搭建了个自己的相册。

相册地址: https://xiaozhou.net/photo

China MVP Open Day 2008 @ 海南 三亚

发表于 2007-10-22 | 分类于 随笔 | | 阅读次数:
字数统计: 185 字 | 阅读时长 ≈ 1 分钟

“China MVP Open Day 2008” 于2007年10月19~10月20日在海南三亚举行。 很高兴参加了这次峰会,峰会的内容相当丰富,除了颁奖典礼,还有精彩的新技术展示讲座,令人难忘的自助餐晚会,沙滩活动……在这次活动中,也见到了一些网上认识的素未谋面的MVP。总的来说,这次活动令人难忘,而且收获颇多。期待下一次的年度峰会。

晒几张照片,还有些照片,在相册中。

晚上抵达酒店,登记注册

峰会正式开始 Sisley & Eddie 做主持

颁奖典礼,Karen & me

沙滩上

Laiyiling & me

泳池五壮士 (赖仪灵,朱永光,钟伟,Kim,me)

ASP.net 2.0中水晶报表迁移部署问题

发表于 2007-10-14 | 分类于 技术控 | | 阅读次数:
字数统计: 440 字 | 阅读时长 ≈ 1 分钟

asp.net 2.0的水晶报表,在迁移机器的时候,如果目标机器没有相应的程序集,在IIS中会报错。 错误描述:

Parser Error Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.

Parser Error Message: Could not load file or assembly ‘Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ or one of its dependencies. The system cannot find the file specified.

【解决方法】

进入你的开发使用机器的c:\windows\assembly目录查看,是否有以下程序集安装在GAC中(如图):

由于资源管理器是使用了shell扩展来查看GAC中安装的程序集,所以我们无法看到这些程序集当前部署的真实目录在什么地方。我们可以直接在命令行模式中进行查看,进入X:\windows\assembly目录,然后查找和水晶报表相关的程序目录(如图):

我们可以大致看到GAC的部署结构了。我们在浏览器中所看到的一个一个的assembly名称,其实对应于assembly目录下面的每一个目录命名。进入具体的目录,还有一级子目录,这个目录的命名,是根据发布到GAC的程序集的版本号加上后面的公钥标记组成。(见上图的下面的红色标记部分)

再进入子目录,我们就可以看到公有部署的程序集,所存在的真正位置了。(如图):

接下来的工作就好办了,拷贝程序集到目标机器上,然后运行gacutil /i filename,将程序集安装到GAC即可。需要拷贝的程序集如下:

1) Microsoft.ReportViewer.Common.dll

2) Microsoft.ReportViewer.ProcessingObjectModel.dll

3) Microsoft.ReportViewer.WebForms.dll

Microsoft MVP Award ,got it!

发表于 2007-10-07 | 分类于 随笔 | | 阅读次数:
字数统计: 25 字 | 阅读时长 ≈ 1 分钟

I’m so happy to receive the Email from MSFT on Oct.2nd. That means I’ve renewed. Thanks Microsoft! Thanks MVP Project! Thanks Everybody!

本本拆机攻略

发表于 2007-09-23 | 分类于 数码控 | | 阅读次数:
字数统计: 466 字 | 阅读时长 ≈ 1 分钟

偶的本本是SONY VAIO,05年买的,一直用到现在。最近用起来,发热量确实惊人,用测试温度的软件看了看,CPU已经达到100摄氏度……[confused]长此以往,CPU非挂了不可…… 由于两年前购买的机器,早已经过了质保期。又打电话,咨询了SONY售后服务中心,得知开机维护费300¥,而且换零件单独算零件费(真是JS啊……)。 看来送去维修,太不划算了。想了想,反正也过了质保期,一不做二不休,干脆自己拆开看看算了。于是就有了这次的拆机体验,呵呵。[cool] 由于自己加装过一根内存条,换过一个硬盘,所以开后盖偶还是比较娴熟了。

首先,去掉内存的后盖,打开硬盘的后盖,并卸掉硬盘

在拧下了N颗螺丝之后,终于卸掉了本本的后盖

这就是CPU部分,也是发热量最惊人的部分,清理的重点部位,CPU被导热铜管盖着,卸下风扇和导热

这是取下的导热风扇和铜管

抠掉导热铜管接触CPU部分残余的导热硅脂硬壳,清理风扇扇页中的灰尘,然后把整个机器简单打扫下。硅脂的作用不可忽视,不管CPU和风扇怎样贴紧,中间还是会有缝隙的,这样就影响了风扇的散热效果。可惜我手上没有多于的导热硅脂,只有空了去电脑城再买点来添上了。[wink]

重新装好机器,又把N颗螺丝逐一拧上,开机看了看,温度下降了不少,看来这次拆机清理还是有点效果[biggrin]

PS:照片是用手机拍的,不清楚,所以大家将就看了

1…333435…48
Timothy

Timothy

Timothy的技术博客,记录技术以及生活点滴

565 日志
8 分类
1187 标签
RSS
github twitter
Links
  • ZWWoOoOo
  • 花開未央
  • 守望轩
  • 大漠说程序
  • ChengBo
  • BlueAndHack
  • 程序员小辉
  • 子痕的博客
  • WoodenRobot
  • VPS大佬
  • 毕扬博客
  • VPSDad
  • 猫爪导航
  • ss1271的奋斗
  • Kian.Li
  • YoungForest
  • Fred's Blog
  • Jacklandrin
© 2025 Timothy
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4