终于收到了GoDaddy的确认邮件,域名转移成功了,恭喜一下自己~
早就有了转移域名的想法,在同事的推荐下,选择了把域名转到GoDaddy去,这样域名解析速度非常快,几乎是实时的,而且域名解析不受任何限制,价格换算成RMB,比国内还便宜,更重要的是,老外会把域名当成是你的虚拟财产,而国内则不然……整个转移的过程几经周折,不过最后算是有了个圆满的结果……推荐下xjb同学的一篇文章《如何转移域名到GoDaddy.com》,非常有指导价值。下一步的打算是把网站空间也搬到国外去,嘿嘿!
君看一叶舟,出没风波里
终于收到了GoDaddy的确认邮件,域名转移成功了,恭喜一下自己~
早就有了转移域名的想法,在同事的推荐下,选择了把域名转到GoDaddy去,这样域名解析速度非常快,几乎是实时的,而且域名解析不受任何限制,价格换算成RMB,比国内还便宜,更重要的是,老外会把域名当成是你的虚拟财产,而国内则不然……整个转移的过程几经周折,不过最后算是有了个圆满的结果……推荐下xjb同学的一篇文章《如何转移域名到GoDaddy.com》,非常有指导价值。下一步的打算是把网站空间也搬到国外去,嘿嘿!
Win7的XP模式一直是Beta版,没想到过了国庆,发布了RTM版本,MSDN订阅上已经可以下载到了。于是迫不及待的从MSDN上拖了一个下来,Win7的XP Mode里面自带一个Professional的正版XP,安装需要给Win7打上一个系统更新的补丁,再一个就是XP的虚拟磁盘文件。两样都安装好过后,还要确认你的CPU是否支持虚拟化技术,并且默认的BIOS里面,CPU的虚拟化设置为Disabled,需要设为Enabled才可以。一切准备就绪,就可以开始运行XP Mode了。
第一次运行XP Mode,系统会为你进行初始化设置:
和其他的虚拟机软件一样,你可以为其指定分配内存大小,虚拟机启动后,界面和其他虚拟机界面相似:
比较方便的是,可以在Win7中运行安装在XP Mode中的软件,并且窗口是直接展现在Win7当中的,这种方式为软件的兼容性提供了更好的平台
微软推出的MyPhone是个非常不错的东东,自从MyPhone的beta版本以来,我都一直用它来向网络同步和备份我的手机联系人信息。如今微软推出了新版本的客户端,版本升级至01.05.2128.0401.其中添加了一些新的特性:
查找丢失的手机
“我的手机空间”服务可以在地图上显示上次所知的手机位置(基于上次使用“我的手机空间”同步或共享照片的位置)。此服务需由用户激活。
锁定丢失的手机
如果手机丢失或被盗,“我的手机空间”可以通过远程锁定您的手机或清除其内容,帮助保护您的信息。此功能仅面向部分市场提供,并可能产生一定的费用。
在主流社交网站上共享照片 现在您可以通过“我的手机空间”Web 帐户或手机轻松便捷地将照片发布到 Facebook、Flickr、MySpace 和 Windows Live。
节省手机空间
当您从手机中删除内容后,仍然可以通过您的 Web 帐户访问这些内容(直到从存档文件夹中删除)。
得知此版本的更新,我也迫不及待的把我手机上的版本进行了升级,总的说来,比先前的版本更好用了,其实我用得最多的,还是同步联系人信息的功能。推荐有Windows Mobile手机的同学都来体验一下,手机下载地址:[http://myphone.microsoft.com/install**](http://myphone.microsoft.com/install)**
随着.Net Framework一路走来,已经让广大开发人员体验到快速开发的甜头,这得益于.Net Framework为我们提供了更高层次的封装,开发人员不必关心底层的Win32 API及其繁琐的调用参数,而可以把大部分的经历放在对业务的分析和实现。随着.Net的不断革新,也引入了更多的特性,例如C# 2.0,就增加了匿名方法和迭代器,这些特性让我们的编码效率更高。随着C# 3.0的推出,引入了更多的新特性,包括:隐式类型局部变量、对象初始化器、Lambda表达式、扩展方法、匿名类型。
而这些特性,都为LINQ的推出,构建好了基础。其中一个比较不错的特性,就是扩展方法。扩展方法,顾名思义,就是在类型定义完成之后,再继续为其添加新的方法。这是相当方便的,比如对于一个已经封装好的Assembly来说,我们不用改动Assembly的代码,而通过扩展方法就能实现对其功能的扩展,而且在调用的时候,仅仅通过代码,你几乎判断不出这是扩展方法,还是Assembly本身的方法。
扩展方法在.Net 3.5中的应用也是非常普遍的,如果你仔细观察,就会发现我们常用的Linq to Object中的Where,Select,Average,Sum等方法,以及Linq to SQL中的Where,Select,Average,Sum等方法,其实都是扩展方法,他们分别定义于System.Linq.Enumerable类和System.Linq.Queryable类之中。
就扩展方法本身而言,也存在一些限制之处。对于编译器来说,如果扩展方法和被扩展类型的方法发生冲突的时候,在调用此方法的时候,究竟是调用被扩展类型的方法,还是扩展方法呢?通过一个例子,我们就能发现其中的区别。
<span class="lnum"> 1: </span> <span class="kwrd">class</span> Program
<span class="lnum"> 2: </span> {
<span class="lnum"> 3: </span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)
<span class="lnum"> 4: </span> {
<span class="lnum"> 5: </span> <span class="kwrd">new</span> TestClassA().Display(<span class="str">"Test"</span>);
<span class="lnum"> 6: </span> <span class="kwrd">new</span> TestClassB().Display(<span class="str">"Test"</span>);
<span class="lnum"> 7: </span> Console.ReadLine();
<span class="lnum"> 8: </span> }
<span class="lnum"> 9: </span> }
<span class="lnum"> 10: </span>
<span class="lnum"> 11: </span> <span class="kwrd">class</span> TestClassA
<span class="lnum"> 12: </span> {
<span class="lnum"> 13: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">int</span> b)
<span class="lnum"> 14: </span> {
<span class="lnum"> 15: </span> Console.WriteLine(<span class="str">"This is TestClassA.Display() ..."</span>);
<span class="lnum"> 16: </span> }
<span class="lnum"> 17: </span> }
<span class="lnum"> 18: </span>
<span class="lnum"> 19: </span> <span class="kwrd">class</span> TestClassB
<span class="lnum"> 20: </span> {
<span class="lnum"> 21: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">string</span> s)
<span class="lnum"> 22: </span> {
<span class="lnum"> 23: </span> Console.WriteLine(<span class="str">"This is TestClassB.Display() ..."</span>);
<span class="lnum"> 24: </span> }
<span class="lnum"> 25: </span> }
<span class="lnum"> 26: </span>
<span class="lnum"> 27: </span> <span class="kwrd">static</span> <span class="kwrd">class</span> TestClassExtention
<span class="lnum"> 28: </span> {
<span class="lnum"> 29: </span> <span class="kwrd">static</span> <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">this</span> <span class="kwrd">object</span> o, <span class="kwrd">string</span> s)
<span class="lnum"> 30: </span> {
<span class="lnum"> 31: </span> Console.WriteLine(<span class="str">"This is TestClassExtention.Display() ..."</span>);
<span class="lnum"> 32: </span> }
<span class="lnum"> 33: </span> }
程序输出:
可以看出,TestClassA的方法和扩展方法并没有冲突,因为他们的方法签名是不一样的,而TestClassB的方法和扩展方法有冲突,因为他们的都是接受一个string类型的输入参数。从结果可以看到,程序对Display的方法调用,TestClassB本身的Display方法,要“优先”于扩展方法Display被调用。因此,类本身的方法如果满足调用条件,那么这个方法会被优先执行,只有在类当中无法找到同样参数的方法时,扩展方法才有机会被执行。所以,我们可以得出这样的结论:扩展方法的优先级较低,也即扩展方法不会覆盖同名的类本身的方法。
另外,还有一个比较明显的区别,就是扩展方法要远远弱于类本身的方法,比如,在一个类中,类的方法可以访问自己的非公有成员,而扩展方法做不到这一点。
VC源动力是一个Visual C++ 开发相关的网站,从2004年09月开始建立,站点的主要宗旨是向广大VC开发爱好者提供免费的文章、代码、交流平台,至今已经有5年的时间了。但是由于我的精力有限,站点长时间荒废没有更新,很是惭愧。再加上如今自己的工作方向不再是VC开发,而是转向.net了开发,所以我决定将VC源动力站点关闭。原来的www.xiaozhou.net由我的个人博客所代替,原有博客的地址https://xiaozhou.net/cooldog也会自动跳转到https://xiaozhou.net。
在此感谢各位网友曾经对该站的支持和帮助,如果这个站点所提供的信息曾经帮助过你解决过VC开发上所遇到的问题,又或者在开发过程中带给你灵感,那将是我的荣幸。等我有时间,我会把所有的站点资料整理成文件供网友下载。希望大家会记得这个名字:VC源动力。
翻了翻BLOG的第一篇日志,是2004年9月7日,记得当时还上大四,由于一时兴起,申请了域名,购买了空间,在网上安了个小家。不知不觉,5年过去了,无奈于国内空间服务商的质量,大叔我中途四处寻觅,换了N个空间服务商,BLOG也到处搬家,真所谓颠沛流离啊。最近也打算把域名迁到国外去,原因不用多说了,中途遇到的挫折更不用说了,待域名迁移成功,写个总结给有相同打算的童鞋看看。5年了,借此文章悄悄纪念下自己的blog。
最近重装了系统,用上了Windows 7,在IIS7中Host WCF Service的时候,遇到一个比较奇怪的问题,当在站点下面添加应用,指向WCF的目录后,访问.svc文件,浏览器提示以下错误:
The page you are requesting cannot be served because of the extension configuration.
If the page is a script, add a handler. If the file should be downloaded, add a MIME map.
这种错误应该是.svc文件没有映射到相关的handler上,因此IIS不知道怎么处理该请求。带着错误信息,在网上搜索了一把,终于找到了解决方法,看来搜索引擎很强大。
解决方法如下:
1.用管理员身份运行cmd命令行
2.切换到目录C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation
3.运行命令: servicemodelreg –i
这样,工具会自动把WCF相关的注册项安装到IIS7中,再打开浏览器访问WCF Service,一切正常。
细想了一下自己的装机过程,先装了VSTS和.net framework,后来发现IIS7没有在windows7里面默认安装,要到部署WCF的时候,才装好IIS7。这样在安装.net framework 3.0的时候,因为没有安装IIS7,所以一些注册项就没有起到作用。此方法可以将WCF的配置项重新配置到IIS7中,供同学们参考。
访问博客,发现杀毒软件弹出病毒警告,直觉告诉我,站点可能被挂马了。果不其然,FTP登录到服务器一看,很多.htm和.js文件都被改了,而且被改的文件还很多,里面都插入了指向恶意站点的链接。感觉像是用程序遍历的,包括每个子目录里面的文件都无一幸免。索性把站点搞了一次大清理,该删的文件删了,该备份的地方备份了。不排除是站点的程序有漏洞,或者是虚拟主机被感染病毒的可能。在此强烈BS一下挂马之人,我将用我余生中的小部分时间,和这种无耻的挂马行为对抗到底!
对于咱们代码民工来说,每天都要面对电脑,而平时眼睛盯得最多的,莫过于Visual Studio集成开发环境了。而Visual Studio的默认背景色颜色是白色的,久而久之,眼睛最容易疲劳。所以,一个好的配色方案,能减少屏幕对眼睛的刺激,也能减缓疲劳。经过长久的收集和摸索,老衲收藏了几种十分不错的配色方案,颜色都很柔和,不刺激眼睛,相当的绿色和环保。下面一一和大家分享一下:
所有的配色方案,都采用的是微软的Consolas字体,这可是微软官方推荐的编程御用字体哦~!效果怎样大家可以自己看了,反正我一直用它。
第一种配色方案(BlueTheme)浅绿色,也是老衲最喜欢的一种颜色。基本上字体颜色都没怎么变,只是改了背景色,色彩柔和。
第二种配色方案(YellowTheme)浅黄,也没改字体颜色,只是该了背景,浅黄,颜色不刺眼
第三种配色方案(GrayTheme)浅灰色
第四种配色方案(DarkTheme)黑色主题,这是一个国外哥们推荐的,很黑很酷
所有的配色方案,我都打包上传了,也就是Visual Studio IDE的配置文件,通过Tools->Import and Export Settings可以方便的导入和导出配置,用以切换主题。
大家还有什么好的配色方案,欢迎分享~
HTC Touch Pro带的重力感应功能很实用,不过一直在寻思能否找到重力感应器的SDK。在网上搜罗了一大圈,都没结果,看来厂商并不希望公开这样的接口。果不其然,在一个国外的网站上,发现了一篇有趣的文章:
http://scottandmichelle.net/scott/comments.html?entry=784
I spent a couple of sleepless hours last night writing a little Sensor Test for my new HTC Diamond. It’s a small app that lets you move a circle around the screen by tilting the device.
Exciting, eh? Well, the fun is in getting it to work. I asked HTC if they provide a development kit (SDK) for the tilt sensor, and they said “No”, so I had to figure it out myself by digging around (and trying to remember what I knew of ARM assembly). I’m just happy I managed to figure it out, and so others can write interesting games with it, I’m giving the source code to what I figured out away. Have fun, create something with it.
相当搞笑,这位哥们本来打算要求HTC提供这样的SDK开发包,想不到被HTC无情的拒绝了,于是一怒之下,把重力感应相关的库文件给反向工程了,并公开了源码。这下可好了,咱们可以开动大脑,设计更多的和重力相关的有趣的应用了。研究了这位外国哥们的代码,重力感应器相关的API,主要包含在一个叫做”HTCSensorSDK.dll”的动态库里面,该动态库主要输出的两个函数分别是:HTCSensorOpen和HTCSensorClose ,用于打开重力感应器和关闭重力感应器。当重力感应器打开之后,可以对手机当前位置的变化进行监视,其实是通过检测注册表的某个键值实现的,具体的路径在Software\HTC\HTCSensor\GSensor的EventChanged。在打开重力感应器的情况下,当这个键的值发生变化,意味着手机的位置已经发生了变动。手机位置的定义包括六种情况,以地平线位置作为参考,可分为:手机正面(屏幕)向上、手机正面(屏幕)向下、手机正面(屏幕)向左、手机正面(屏幕)向右、手机正面(屏幕)向前、手机正面(屏幕)向后。而这六种位置在注册表键EventChanged中均有不同的值表示。
为了方便应用,我将开启/关闭 重力感应器的代码抽取了出来,做成一个动态连接库,暴露的接口如下:
<span class="lnum"> 1: </span><span class="kwrd">extern</span> <span class="str">"C"</span> __declspec(dllexport) BOOL EnableGSensor();
<span class="lnum"> 2: </span><span class="kwrd">extern</span> <span class="str">"C"</span> __declspec(dllexport) BOOL DisableGSensor();
这样就能方便的开启和关闭重力感应器了。
下面就可以用简单的MFC Dialog程序来测试重力感应了:
定义注册表路径和被监视的键值
<span class="lnum"> 1: </span><span class="preproc">#define</span> SN_GSENSOR_ROOT HKEY_LOCAL_MACHINE
<span class="lnum"> 2: </span><span class="preproc">#define</span> SN_GSENSOR_PATH _T(<span class="str">"Software\\HTC\\HTCSensor\\GSensor"</span>)
<span class="lnum"> 3: </span><span class="preproc">#define</span> SN_GSENSOR_VALUE _T(<span class="str">"EventChanged"</span>)
定义注册表值掩码,以及6个不同位置的值
<span class="lnum"> 1: </span><span class="preproc">#define</span> SN_GSENSOR_BITMASK 0xF
<span class="lnum"> 2: </span>
<span class="lnum"> 3: </span><span class="preproc">#define</span> orIENTATION_LANDSCAPE 0
<span class="lnum"> 4: </span><span class="preproc">#define</span> orIENTATION_REVERSE_LANDSCAPE 1
<span class="lnum"> 5: </span><span class="preproc">#define</span> orIENTATION_PORTRAIT 2
<span class="lnum"> 6: </span><span class="preproc">#define</span> orIENTATION_UPSIDE_DOWN 3
<span class="lnum"> 7: </span><span class="preproc">#define</span> orIENTATION_FACE_DOWN 4
<span class="lnum"> 8: </span><span class="preproc">#define</span> orIENTATION_FACE_UP 5
定义注册表值变化的Windows Message类型
<span class="lnum"> 1: </span><span class="preproc">#define</span> WM_EVENTCHANGED (WM_USER + 1)
在消息映射宏中,定义响应自定义消息WM_EVENTCHANGED的处理函数
<span class="lnum"> 1: </span>ON_MESSAGE(WM_EVENTCHANGED,OnEventChanged)
这样,我们就可以在Dialog程序的初始化函数里面实现相应的代码:
<span class="lnum"> 1: </span>BOOL CTestDlg::OnInitDialog()
<span class="lnum"> 2: </span>{
<span class="lnum"> 3: </span> CDialog::OnInitDialog();
<span class="lnum"> 4: </span>
<span class="lnum"> 5: </span> <span class="rem">// Set the icon for this dialog. The framework does this automatically</span>
<span class="lnum"> 6: </span> <span class="rem">// when the application's main window is not a dialog</span>
<span class="lnum"> 7: </span> SetIcon(m_hIcon, TRUE); <span class="rem">// Set big icon</span>
<span class="lnum"> 8: </span> SetIcon(m_hIcon, FALSE); <span class="rem">// Set small icon</span>
<span class="lnum"> 9: </span>
<span class="lnum"> 10: </span> <span class="rem">// TODO: Add extra initialization here</span>
<span class="lnum"> 11: </span> g_hSensorEvent = NULL;
<span class="lnum"> 12: </span>
<span class="lnum"> 13: </span> RegistryNotifyWindow(
<span class="lnum"> 14: </span> SN_GSENSOR_ROOT,
<span class="lnum"> 15: </span> SN_GSENSOR_PATH,
<span class="lnum"> 16: </span> SN_GSENSOR_VALUE,
<span class="lnum"> 17: </span> GetSafeHwnd(),
<span class="lnum"> 18: </span> WM_EVENTCHANGED,
<span class="lnum"> 19: </span> SN_GSENSOR,
<span class="lnum"> 20: </span> NULL,
<span class="lnum"> 21: </span> &g;_hSensorEvent);
<span class="lnum"> 22: </span>
<span class="lnum"> 23: </span> gSensorWrapper.EnableGSensor();
<span class="lnum"> 24: </span>
<span class="lnum"> 25: </span> <span class="kwrd">return</span> TRUE; <span class="rem">// return TRUE unless you set the focus to a control</span>
<span class="lnum"> 26: </span>}
RegistryNotifyWindow函数,通过监视注册表的指定路径下,指定键值的变化,向我们的窗口发送WM_EVENTCHANGED消息,而我们在消息映射宏中所定义的OnEventChanged函数,就用来响应和处理这样的自定义消息。
最后,在我们的OnEventChanged函数中,就可以获得当前手机的位置了:
<span class="lnum"> 1: </span>afx_msg LRESULT CHangupPhoneDlg::OnEventChanged(WPARAM wParam, LPARAM lParam)
<span class="lnum"> 2: </span>{
<span class="lnum"> 3: </span> nLastEvent = (wParam & SN_GSENSOR_BITMASK);
<span class="lnum"> 4: </span>
<span class="lnum"> 5: </span> <span class="kwrd">switch</span> (nLastEvent)
<span class="lnum"> 6: </span> {
<span class="lnum"> 7: </span> <span class="kwrd">case</span> orIENTATION_LANDSCAPE:
<span class="lnum"> 8: </span> szMessage = _T(<span class="str">"Last Event: 正面向右"</span>);
<span class="lnum"> 9: </span> <span class="kwrd">break</span>;
<span class="lnum"> 10: </span> <span class="kwrd">case</span> orIENTATION_REVERSE_LANDSCAPE:
<span class="lnum"> 11: </span> szMessage = _T(<span class="str">"Last Event: 正面向左"</span>);
<span class="lnum"> 12: </span> <span class="kwrd">break</span>;
<span class="lnum"> 13: </span> <span class="kwrd">case</span> orIENTATION_PORTRAIT:
<span class="lnum"> 14: </span> szMessage = _T(<span class="str">"Last Event: 正面向后"</span>);
<span class="lnum"> 15: </span> <span class="kwrd">break</span>;
<span class="lnum"> 16: </span> <span class="kwrd">case</span> orIENTATION_UPSIDE_DOWN:
<span class="lnum"> 17: </span> szMessage = _T(<span class="str">"Last Event: 正面向前"</span>);
<span class="lnum"> 18: </span> <span class="kwrd">break</span>;
<span class="lnum"> 19: </span> <span class="kwrd">case</span> orIENTATION_FACE_DOWN:
<span class="lnum"> 20: </span> szMessage = _T(<span class="str">"Last Event: 正面向下"</span>);
<span class="lnum"> 21: </span> <span class="kwrd">break</span>;
<span class="lnum"> 22: </span> <span class="kwrd">case</span> orIENTATION_FACE_UP:
<span class="lnum"> 23: </span> szMessage = _T(<span class="str">"Last Event: 正面向上"</span>);
<span class="lnum"> 24: </span> <span class="kwrd">break</span>;
<span class="lnum"> 25: </span> <span class="kwrd">default</span>:
<span class="lnum"> 26: </span> szMessage = _T(<span class="str">"Last Event: Unknown"</span>);
<span class="lnum"> 27: </span> <span class="kwrd">break</span>;
<span class="lnum"> 28: </span> }
<span class="lnum"> 29: </span>
<span class="lnum"> 30: </span> <span class="kwrd">this</span>->GetDlgItem(IDC_DISPLAY)->SetWindowTextW(szMessage);
<span class="lnum"> 31: </span>
<span class="lnum"> 32: </span>
<span class="lnum"> 33: </span> <span class="kwrd">return</span> 0L;
<span class="lnum"> 34: </span>}
启动测试程序,翻转手机到不同的位置,就能在Dialog框中,实时看到当前手机位置状态,Cool!
测试程序比较简单,就不放上来了,把封装的重力感应器的动态库放上来,供有兴趣的同学下载。
可以进行测试的手机型号:多普达(Dopod) Touch Diamond、多普达(Dopod) Touch Pro 或者 HTC Touch Diamond 和 HTC Touch Pro.
我的开发测试环境: Windows Vista 64bit, Visual Studio 2008 SP1, Windows Mobile 6.0 Professional SDK.
最近败了个QWERTY全键盘的HTC Touch pro,全键盘的感觉不错,输入速度比以前靠触摸笔点屏幕快多了。装了个Python的Windows mobile版本,没事学着写Python玩玩。一日突发奇想,要是能在PPC手机上写C#的程序并能运行起来,那就太棒了。果然不出我所料,国外已经有大侠已经做好了这个东东,一个运行在Windows Mobile手机上的简单的C# IDE,让你可以随时在你的PPC手机上写C#的程序。这是作者自己实现的一个简单IDE,现在已经支持的功能如下:
IDE的使用非常简单,写入你的代码,然后可以立即运行,看到结果。
简单的例子,如下:
<span class="lnum"> 1: </span><span class="kwrd">using</span> System.Windows.Forms;
<span class="lnum"> 2: </span><span class="kwrd">namespace</span> TestNS
<span class="lnum"> 3: </span>{
<span class="lnum"> 4: </span> <span class="kwrd">class</span> TestCL
<span class="lnum"> 5: </span> {
<span class="lnum"> 6: </span> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main()
<span class="lnum"> 7: </span> {
<span class="lnum"> 8: </span> MessageBox.Show(<span class="str">"Hello Timothy!"</span>);
<span class="lnum"> 9: </span> }
<span class="lnum"> 10: </span> }
<span class="lnum"> 11: </span>}
点击菜单下面的Debug->Run,运行结果截图如下:
IDE自带一些简单的功能, 包括插入代码模板,编辑(复制、粘贴、剪切)功能,还支持插件功能。
软件下载地址: http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile.zip
Code Sample: http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_samples.zip
用户手册、帮助文档地址: http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_manual/index.htm
作者主页:http://www.geocities.com/hrowson/wm5_software/index.htm
赶紧下载吧,write your C# code anywhere! 活活~~