10月6日从深圳回来,迫不及待地打开我的hotmail,果然有一封邮件在那里,标题是“恭喜你……”。很荣幸的连任MVP,被授予2007 Microsoft® MVP 称号。
在此特别感谢Microsoft,感谢Sisley,感谢CCTV。我会更加努力的。 [cool] 今天去梁振的MSN Space,看到他也连任成功,再次祝贺你哦 :)
从今日起,恢复Blog的MVP标徽。
君看一叶舟,出没风波里
10月6日从深圳回来,迫不及待地打开我的hotmail,果然有一封邮件在那里,标题是“恭喜你……”。很荣幸的连任MVP,被授予2007 Microsoft® MVP 称号。
在此特别感谢Microsoft,感谢Sisley,感谢CCTV。我会更加努力的。 [cool] 今天去梁振的MSN Space,看到他也连任成功,再次祝贺你哦 :)
从今日起,恢复Blog的MVP标徽。
不知不觉,又快一年了。而在9.30号,我的MVP一年的任期也将结束了。回顾这一年,自己又有了不少的进步。从最开始的VC到现在接触到.net,对我的发展方向也有很大的影响。MVP不仅仅是一个称号,而是一种文化、一种勉励。让我能不断的去学习新的技术,和大家一起分享。
在这一年,我有幸参加了成都的MVP Open Day,见到了传说中的MVP Leader :Sisley。也见到了Eddie Liu。认识了Eric Liu,Eric Zhong,Richie,Simon,Jack,Kim,还有Aaron Zhao,和张美波,梁振.
估计10月连任的消息会在国庆左右公布,希望自己连任能成功。从今天起,我会取消在我的blog上面的MVP徽标。希望能有机会再次将他挂上 [cool]
上次写过一个调试windows服务的一点经验的日志。这段时间也在做一个和Windows Service有关的东西。又有了些经验,所以拿来和大家分享下。调试windows服务,采用的一般方法,就是设好断点,然后启动服务,在IDE里面直接通过进程列表,把Service的exe附加到IDE上面来调试,这个方法在上一个日志也提到过。其实在.NET建立的服务程序中,还有一个方法,也是之前没有想到的方法,更为简单 :)
// 进程的主入口点 static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun;
// 同一进程中可以运行多个用户服务。若要将
//另一个服务添加到此进程,请更改下行
// 以创建另一个服务对象。例如,
//
// ServicesToRun = New System.ServiceProcess.ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
也就是在Main方法,服务程序开始的地方,如上,把默认的创建并运行服务的代码全部注释掉,然后直接生成本类的一个实例,然后调用OnStart方法就可以了,这里要注意的是OnStart方法是一个受保护的无返回值的方法,而Main函数是静态方法,所以需要把OnStart也改动一下,设置为静态函数。这样的话,服务和一般的.net应用程序就一样了,调试的时候更加方便,直接F5就可以了 :) 不过在完成调试过后,一定记得要把上面的改动还原 [cool]
改动后的代码如下:
// 进程的主入口点
static void Main()
{
Service1 obj=new Service1();
obj.OnStart();
}
这个方法虽然有点投机,不过确实能够节省很多步骤,让调试服务和调试一般的应用程序那样方便!值得推荐
打开音乐播放器,听着无印良品的《胡思乱想》,喝着可乐,敲着键盘。我又来了。实在想不出一个恰当的标题,所以就以这首歌来命名了。到CSDN论坛和同学的BLOG上逛了逛,又想起了那惬意的大学时光,想起军训的时候,一起在操场上晒太阳。寝室里几个同学一起出去FB,喝酒,一起谈论将来的打算,规划着自己的未来,仿佛一切都是昨天的事。可是现在都各奔东西了,很难再聚到一起。前两天收到柯班长的短信,他也要去山东了,说以后见面的机会也少了。 晕。。。“首长“也去深圳混了,不过我还是时时发短信骚扰他,呵呵。冬瓜也开始搞JSP了,恭喜,我们班第一个女程序员。哈哈。看了卡罗斯的BLOG,果然是雅安的才子,每篇文章都充满艺术细胞。
最近在网上买了2本英文原版的计算机书,一本是《.NET本质论–公共语言运行库》,一本是《深入浅出设计模式》。其实早在上大学的时候,就有想买原版英文书的愿望了,只是对自己英文没信心,怕买了看不懂,浪费。不过这次确实没办法,《.NET本质论–公共语言运行库》缺货,只有英文版的有货。另一本《深入浅出设计模式》,是我的同事Simon介绍的,比较经典,而且现在国内还没有中文版的,说是怕翻译差了被读者骂,貌似还没有人来翻译,呵呵。我以及准备装个金山词霸,有不懂的单词就查。
这段时间,公司在搞BizTalk的培训,培训完了还要考试,郁闷。以后的公司业务,都要往SOA架构转移。下来看了BizTalk的视频资料,收获不少。对整个BizTalk的原理和开发流程有了一定的了解。不过BizTalk也不是省油的灯,对机器要求比较高,最低1GB内存。再加上装一个SQL Server 2005、Visual Studio 2005 (My god…)。幸好上次把我的本本升级为1GB。不过硬盘空间可能不够了,看来要搭建这样的环境,还要好好清理一下硬盘。最近想学的东西也很多,想学学C++/CLI, VC界面开发技术,感觉自己浮躁了点,该好好静下来看看书了。[cool]
最后总结一下,这个夏天,我还是有收获的,喜爱上了游泳,特别是潜水,在水下感觉很舒服,不过天气也凉了,不知道还能不能继续游。
今天在MSDN网站上逛,看到了醒目的XNA标题。不得不佩服MS在平台这方面的雄心。 XNA,是MS针对游戏领域开发的一个体系。现在只要谈到未来的游戏发展蓝图几乎跟XNA脱不了关系。由于XNA整合了电脑/ XBOX家族 / 手机游戏 的开发环境,甚至可说XNA是未来XBOX二代机最重要的核心,也难怪MS对XNA如此重视。这样看来,在经后的游戏开发,就有了一个统一的平台,这也可以看出MS在游戏领域的雄心。MS同时提供XNA Game Studio Express/Professional 开发环境。 XNA Framework也是一系列的托管类库,是基于.NET 2.0的,并且建立在DirectX基础之上。通过XNA Game Studio,游戏开发者、游戏爱好者,都可以根据自己的爱好来开发游戏了,这不得不是一个诱人的地方。想想自己也可以开发游戏了,不用像以前那样,用C/C++调用复杂的Direct X SDK来开发游戏的过程。把这些绘图、物理运算、音效、网络等不同范围的程序完全整合在一个工具中,并提供最完善的函数库让游戏开发人员能学会使用、全盘了解,这就是XNA Framework。也许这还不够,而在MS规划中希望XNA Framework的最终目标,能让开发一款游戏就像制作一个网页那么简单!
有关更多XNA的信息: http://msdn.microsoft.com/directx/XNA/default.aspx
最近做的一个项目,涉及到对某个目录的操作的监视,其实在.NET中,使用.NET中的文件监视类,就可以轻松实现对某个目录,以及其子目录的文件监视。比如新建文件、修改文件、删除文件等操作。并且能够以事件的形式通知程序。只要我们在事件委托里面,绑定相应的处理函数即可。.NET的功能果然很强大,只需要几句简单的调用,我们就可以实现这样的监视功能了。
我们以一个例子来实现吧:
static void Main(string[] args)
{
FileSystemWatcher m_Watcher=new FileSystemWatcher();
m_Watcher.Path=@"d:\test";
m_Watcher.IncludeSubdirectories=true;
m_Watcher.Filter="*.*";
m_Watcher.NotifyFilter=NotifyFilters.LastWrite | NotifyFilters.FileName;
m_Watcher.Created+=new FileSystemEventHandler(OnChanged);
m_Watcher.Changed+=new FileSystemEventHandler(OnChanged);
m_Watcher.Deleted+=new FileSystemEventHandler(OnChanged);
m_Watcher.EnableRaisingEvents=true;
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
private static void OnChanged(object sender, FileSystemEventArgs e)
{
Console.WriteLine(DateTime.Now.ToString()+" {0} {1}",e.ChangeType,e.FullPath);
}
程序比较简单,先是生成FileSystemWatcher的实例,然后进行相应的设置。我在这里设置要监控的目录 为D:\Test,监控所有文件,也即.。然后通过事件,添加响应事件的函数OnChanged到Created、Changed以及Deleted事件中。这样的话,当文件被创建、修改、或者被删除的时候,就能调用我们的OnChanged函数。此函数中的FileSystemEventArgs包含了具体事件的一些信息。比如被修改的文件名、被出发的事件类型等等。通过在回调函数的判断,我们就可以实现响应的操作了。
程序运行效果如下图:
【代码下载】 点击下载此文件
每一个开发出来的软件,在发布之前,都需要进行测试。因为没有程序员敢保证自己的代码没有BUG。而测试又分为很多种,今天所要介绍的单元测试,属于众多测试手段中的一种。我的观点,单元测试是应该由开发人员在编码过程结束后,所进行的一种自我测试手段,是测试过程的第一步。
单元测试的目的,就是针对要测试的模块或者方法,写一段代码用来测试,看是否达到预期的结果。不同的开发语言,单元测试的工具也不一样。JAVA语言开发系统:目前比较流行的是JUnit;.Net语言开发系统:目前比较流行的是:NUnit;C/C++语言开发系统:目前比较流行的是CPPUnit。
今天要介绍的是NUnit,NUnit的工具,大家可以到www.nunit.org的网站去下载。下载后双击安装,在桌面可以找到一个NUnit的GUI程序快捷方式。NUnit提供GUI和CUI的两种界面。
首先,我们要构建一个被测试的类。在这里,我们假定有一个类 MyClass:
1 | namespace NUnitTest |
类提供一个Add方法和一个CurrentValue的属性。Add方法,用于对成员变量m_Value值进行加法运算。 CurrentValue属性用于获取当前m_Value的值。
在完成这个类之后,我们就需要对这个类进行单元测试了。具体的方法,是建立另外一个类库,在这个工程里面,引用我们的MyClass类所在的程序集。并且在NUnit的安装目录下的bin子目录,添加对NUnit.Framework.dll的引用。我们的测试类构建如下:
1 | using System; |
注意,其中的[TestFixture]和[Test]两个Attribute为NUnit所规定必须要添加的,这样,测试框架就可以知道哪些类或者方法需要进行测试。并且根据NUnit在线文档的规定,测试的方法之前,必须加上Test特性。并且改方法必须返回void,还不能带输入参数。
在这个方法种,就是我们针对Add方法的具体测试代码了,代码比较简单,就是调用Add方法,改变m_Value的值为50。然后调用Assert类的静态方法AreEqual进行测试,比较m_Value当前的值是否是我们所预期的值:50。
保存好工程后,编译该测试的程序集。然后打开NUnit GUI程序。加载这个测试的程序集到工具中。选中工程,然后点击右边的Run按钮。如果左边全部变为绿色,表示测试通过。
加入我们将上面的
1 | Assert.AreEqual(50,obj.CurrentValue); |
改为:
1 | Assert.AreEqual(60,obj.CurrentValue); |
显然,我们期望的值是60,而实际值并不是60。则测试不会通过,并且会提示:
1 | NUnitTest.MyClassTest.TestMethod : |
在下面的输出窗口,会提示发生错误的具体的代码位置:
1 | at NUnitTest.MyClassTest.TestMethod() in d:\mycode\c# projects\nunittest\myclasstest\myclasstest.cs:line 24 |
这样,我们能够方便的找到出错的地方,并进行分析和改正。NUnit对单元测试提供了很多的方便,它还提供了很多方便和功能强大的类。具体的用法,大家可以参考NUnit官方网站的在线文档。
MSN的闪屏效果,大家一定见过了吧。如何在其他程序中实现这样的效果呢?偶突然心血来潮,模拟了一下MSN闪屏效果的实现。其实原理很简单,就是播放一段声音,然后开个线程来MoveWindow,只不过MoveWindow要设定好坐标,这样窗口不断移动,看起来像是在振动的效果一样。呵呵。没什么技术含量。我把这个功能封装成了一个DLL,大家直接调用这个DLL,传入目标窗口的Handle,然后调用DLL的函数就可以了。
代码中包含调用的示例代码和闪屏模拟的DLL。 下载下来看看就知道了。 [cool]
今天把Blog换了一个版本。以前是L-Blog不过这个blog似乎作者很久没有更新了。看来要淡出历史舞台了。装了一个比较流行的PJBlog,整体看来还不错。而且还提供L-Blog到PJBlog的数据库转换程序,所以省了不少麻烦。呵呵。而且这个版本的blog优点还在于支持插件功能,可以自由组合插件,灵活度很高。[cool]
今年3月,在之前的公司做的一个工控机测控程序,需要到现场去调试,于是就有了这次的哈尔滨之行。这也是我第一次去哈尔滨。3月,当成都龙泉的桃花盛开的时候,哈尔滨气温还在零下,俨然一副严冬的模样。刚下飞机的时候,并没有看到雪,只是看地上处处还留有冰块。幸好之前我带了羽绒服,要不然非冻坏不可。调试的工作还算顺利,在将要离开的时候,哈尔滨还下了一场大雪,让人喜出望外,本以为看不到雪了。第二天起来,和同事吃了早饭,就迫不及待出门去拍照了。路上的人看到我们在雪中照相,感觉有点诧异,唉,谁叫我们四川冬天不下雪呢~~
【松花江边上,江面结冰了】
【在铁路机务段的桥上】
【我的作品】
【机车车间外】
【机车车间外2】
最近的项目涉及到windows服务的问题,那么写在windows服务中的代码怎样调试呢?windows服务的调试方法和我们一般的程序方法有些不一样,但是也是在IDE里面调试。MS的IDE也为我们考虑到了这些方面。跟我来看看怎样来调试一个windws服务吧?[cool]
大致分为一下几个步骤:
还有一些调试windows服务小的窍门,就是写日志文件。这也是调试windows service的一个比较好的方法,虽然比较笨,但是通过阅读你自己留下的日志,也能起到不小的作用的。所以在编写程序的时候,要在关键的地方,记录日志,也是为以后程序的维护提供方便。 好了,一点小小的经验,写下来,希望对大家有帮助 。[cool]