iTimothy

君看一叶舟,出没风波里


  • 首页

  • 分类

  • 归档

  • 项目

  • 关于

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:照片是用手机拍的,不清楚,所以大家将就看了

.NET开发常见问题两则

发表于 2007-09-22 | 分类于 技术控 | | 阅读次数:
字数统计: 704 字 | 阅读时长 ≈ 2 分钟

一、关于DateTime 在将DateTime类型,插入到数据库的时候,最容易出现的一种错误: “SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间” 原因是我们在取DateTime.MinValue的值,并插入到数据库的时候,DateTime.MinValue值范围和数据库DateTime类型数据范围不一致造成的。数据库中,DateTime类型字段,最小值1/1/1753 12:00:00,而.NET Framework中,DateTime类型,最小值为1/1/0001 0:00:00,显然,超出了Sql的值的最小范围,导致数据溢出的错误。

解决方法:使用System.Data.SqlTypes.SqlDateTime.MinValue替代System.DateTime类型,这样SqlDateTime的MinValue和Sql中DateTime的范围吻合,就不会再出现以上的错误了。

二、关于跨线程调用控件的问题 在.NET 2.0中,我们常常需要在新建的线程,比如一个工作线程中访问UI控件,程序编译没有任何错误,但是在运行的时候,会抛出异常:InvalidOperationException,并提示消息:“从不是创建控件 control name 的线程访问它。” 原因是因为:访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。.NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题。

我们看看有问题的代码:建立新线程,并试图在线程中跨线程调用UI控件
[code]
   private void button1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ThreadStart(TestFunc));
        thread.IsBackground = true;
        thread.Start();
    }

    private void TestFunc()
    {
        Thread.Sleep(3000);
        label1.Text = "ok!";
    }

  [/code]

  这样在运行的时候,就会抛出InvalidOperationException异常。

解决方法:
方法1.关闭跨线程调用控件的检查,来屏蔽掉此异常
需要将Control.CheckForIllegalCrossThreadCalls 设为 false即可。(不推荐)

方法2.使用Control类的Invoke和BeginInvoke
  为什么使用Invoke和BeginInvoke可以解决问题呢?因为Control的Invoke和BeginInvoke的参数为delegate,委托的方法是在Control的线程上执行的,也就是我们平时所说的UI线程。而控件也是在UI线程,所以不存在跨线程调用控件的问题。于是我们有了改进的代码:

[code]
   private void button1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ThreadStart(TestFunc));
        thread.IsBackground = true;
        thread.Start();
    }

    private void TestFunc()
    {
        Thread.Sleep(3000);
        this.Invoke(new SetLabel(SetLabelText), new string[] { "ok!" });
    }

    private delegate void SetLabel(string s);

    private void SetLabelText(string s)
    {
        label1.Text = s;
    }

  [/code]

建立一个委托,调用Control类的Invoke方法,让UI线程去执行委托实例化的方法。这样就不会出现异常了。
1…333435…47
Timothy

Timothy

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

564 日志
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