<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>.NET</title><link>http://www.webuc.net/chinahuman/category/186.aspx</link><description>.NET</description><managingEditor>铁匠</managingEditor><dc:language>af</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>铁匠</dc:creator><title>编程实现avi文件的流播放</title><link>http://webuc.net/chinahuman/archive/2009/01/12/10323.aspx</link><pubDate>Mon, 12 Jan 2009 17:16:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2009/01/12/10323.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10323.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2009/01/12/10323.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10323.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10323.aspx</trackback:ping><description>&lt;p&gt;有时候会碰到一些比较BT的需求，比如说想要实现avi的在线播放。有时候会发现一些工具能实现，但是发现总是不够稳定。原因在于协议，如果播放器写得好，可以一边下载，一边分析下载的流，来实现播放。但是想要实现快进，或是拖动这些的就不容易了。&lt;/p&gt; &lt;p&gt;要解决这些问题，只有一点，那就是自己来实现这套流协议，然后作播放器来播放。为了实现这些东西，偶作一下分析，可以简单地把技术点分为三个：&lt;/p&gt; &lt;p&gt;1.流服务器的实现&lt;/p&gt; &lt;p&gt;2.流播放器的实现&lt;/p&gt; &lt;p&gt;3.注册客户端，来实现播放器的关联（这样点击网页上的链接时，可以自动弹出我们的播放器来播放）&lt;/p&gt; &lt;p&gt;接下来让我们详细地看看具体的实现分析吧。&lt;/p&gt; &lt;h3&gt;一、流服务器的实现&lt;/h3&gt; &lt;p&gt;我们可以通过分析AVI的文件格格式，以及播放时的需要，可以弄出来一个很简单的流协议。并且为了方便使用，我还是基于标准的HTTP协议上来扩展实现。在这里，我把这个协议分成了两大块：媒体摘要和媒体块。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;媒体的摘要&lt;/strong&gt;：根据我们在播放AVI的时候的要求，我们的摘要里面要含有这些信息：宽，高，帧率，解码器类型，流的数量（音频和视频），推荐的缓冲大小，总帧数，如果有音频流，那还得指定音频的采样频率，位数等信息，以及每一帧的索引。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;媒体块&lt;/strong&gt;：在这里面，我们就是真正的下载数据了，每次请求的帧数，这个可以根据我们的应用环境综合考虑了，主要要考虑以下几点：下载尽量快，请求数尽量少。&lt;/p&gt; &lt;p&gt;有了服务器的这些支持，我们就可以实现我们的客户端了。&lt;/p&gt; &lt;h3&gt;二、流播放器的实现&lt;/h3&gt; &lt;p&gt;具体的播放实现我在这里就不多写了，对于媒体播放器来说，无非就是拿到一帧数据，然后调用对应的解码器解成位图数据，然后把它画在界面上。&lt;/p&gt; &lt;p&gt;在这里主要讲流播放器数据的请求和快进的实现：&lt;/p&gt; &lt;p&gt;我把程序划成两个线程：一个线程负责下载数据，另一个线程负责把内容绘在界面上。&lt;/p&gt; &lt;p&gt;第一步获得媒体的摘要。得到这个摘要后，我们就可以得到媒体的大概信息了。然后再顺序地把索引表发送到服务器上去请求数据。为了更好的播放性能，我们可以把下载下面的媒体块保存在临时文件里面，然后再加一个索引位置来标明每一帧的起始位，以及长度。当播放时，如果发现该帧还未下载。就给那个下载线程发个请求，让它下次下载的时候，就从这个位置开始。所以快进这些的实现就变得很简单了，如果没有下载，只要很短时间的buffer就可以继续播放了。&lt;/p&gt; &lt;h3&gt;三、注册客户端&lt;/h3&gt; &lt;p&gt;为了更好的体验，偶们可以注册新的协议，这样用户在点击浏览器上的链接的时候，就可以自动打开我们的播放器来播放，偶暂把这个协议定为：ivp(Ironsoft Video Protrol).注册协议很简单，只要把以下的注册导入就可以了，当然我们也可以编程实现生成这些注册表：&lt;/p&gt; &lt;p&gt;Windows Registry Editor Version 5.00  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP]&lt;br&gt;@="IVPProtocol"&lt;br&gt;"URL Protocol"="\"C:\\Program Files\\IronSoftPlayer\\player.exe\""  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\DefaultIcon]&lt;br&gt;@="\"C:\\Program Files\\IronSoftPlayer\\player.exe\",1"  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\shell]  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\shell\open]  &lt;p&gt;[HKEY_CLASSES_ROOT\IVP\shell\open\command]&lt;br&gt;@="\"C:\\Program Files\\IronSoftPlayer\\player.exe\" \"%1\""  &lt;p&gt;? &lt;p&gt;好了，avi的在线流播放就可以很轻松地实现了。嘿嘿，偶一共是用三个工作日左右就全部实现了。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10323.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>在asp.net下面使用Ironsoft的FlashCapture</title><link>http://webuc.net/chinahuman/archive/2009/01/08/10319.aspx</link><pubDate>Thu, 08 Jan 2009 05:42:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2009/01/08/10319.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10319.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2009/01/08/10319.aspx#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10319.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10319.aspx</trackback:ping><description>&lt;p&gt;IronSoft的FlashCapture可以说是当前已知的一个唯一的可以实现flash抓图的组件，可惜它是在asp才能使用。现在跟着我来看看，如何在asp.net下面去调用它。&lt;/p&gt; &lt;p&gt;首先，在asp.net下添加FlashCapture的引用：&lt;/p&gt; &lt;p&gt;选中网站的项目，然后右键，选择“添加引用”，在弹出来的框里面选择”COM”这个选项卡，往下拉，找到”Ironsoft Library”,然后点击确定，这时候可以看到在bin目录下面添加了：Interop.IronSoft.dll.&lt;/p&gt; &lt;p&gt;其实就是添加代码：&lt;/p&gt; &lt;p&gt;FlashCaptureClass fc = new FlashCaptureClass();&lt;br&gt;fc.FileName = Server.MapPath("test.swf");&lt;br&gt;fc.CaptureFrame = 1;&lt;br&gt;fc.Save(Server.MapPath("test.jpg"));  &lt;p&gt;这时候你会发现图片是抓出来了，可是是一片白的。这是因为asp和asp.net的线程模型不一样了，所以出现了这样的问题，这时候我们要设置asp.net的这个页面的Asp兼容模式：AspCompat 为"true"。也就是写在asp页面的顶上，如： &lt;p&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="FlashCapture.aspx.cs" Inherits="FlashCapture" AspCompat="true" %&amp;gt; &lt;p&gt;这下子抓出来的图片里面就有内容了(IronSoft的其它组件调用如果有类似的问题，也都可以这样处理)。 &lt;p&gt;最后，如果你用VS自带的服务器功能来调试的时候，会发现系统的状态栏上多了一个图标。这说明这时候FlashCapture组件并没有被释放掉。可以用以下代码来实现释放： &lt;p&gt;System.Runtime.InteropServices.Marshal.ReleaseComObject(fc);&lt;br&gt;GC.Collect();  &lt;p&gt;这样就轻松实现了在asp.net下面实现Flash的抓图功能了。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10319.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>开发Office的一些应用部署后出现找不到程序集的解决方法</title><link>http://webuc.net/chinahuman/archive/2009/01/07/10317.aspx</link><pubDate>Wed, 07 Jan 2009 14:22:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2009/01/07/10317.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10317.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2009/01/07/10317.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10317.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10317.aspx</trackback:ping><description>&lt;p&gt;有时候开发一些应用，需要用到Office的一些组件，比如说在线生成Excel，或是Word文档。在自己的机器上跑得满好的，可是部署的时候，发现报错，如：“未能加载文件或程序集“Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。系统找不到指定的文件。 ”。这个最常规的办法就是在服务器上安装一个Office。不过这太大了，而且有时候并不一定需要真的Office在上面运行。为了解决这个问题，微软发布了Office的一些更新包：Redistributable Primary Interop Assemblies.&lt;/p&gt; &lt;p&gt;下载地址是：&lt;/p&gt; &lt;p&gt;Office2003: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Office2007:http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&amp;amp;displaylang=en&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;不过微软不建议我们这样来用Office。上面写了，如果把它放在asp.net或是windows服务中，Office会变得不稳定或是没有响应。这也就是为啥有时候服务器上会多很多Office相关的进程，因为没有办法正常地关闭它。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10317.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>string.format()是否应该多用？</title><link>http://webuc.net/chinahuman/archive/2008/12/08/10259.aspx</link><pubDate>Mon, 08 Dec 2008 03:06:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/12/08/10259.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10259.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/12/08/10259.aspx#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10259.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10259.aspx</trackback:ping><description>&lt;p&gt;前一阵子，项目中的一个页面每秒只能处理300次，而这个页面的逻辑也不复杂，就是根据条件拼出一个字串然后输出。开始以为这里面逻辑太复杂，所以有问题。不过后面发现了vs里面带了性能分析工具，于是抱着试试看的想法，作了一下性能分析。最后的结果让人大吃一惊：string.format这个操作竟然用掉了一半的时间，为啥它会这么费时间呢?为了真相，我用.net reflector查看了string的实现：&lt;/p&gt; &lt;p&gt;public static string Format(IFormatProvider provider, string format, params object[] args)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((format == null) || (args == null))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException((format == null) ? "format" : "args");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; builder.AppendFormat(provider, format, args);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return builder.ToString();&lt;br&gt;}&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;很让人吃惊，string.format竟然是调用了StringBuilder的AppendFormat来实现的。再继续根下去（这个源码只是通过IL得来的，可能和原始的不太一样，但是差不多了），注意里面的红色的那句：&lt;/p&gt;
&lt;p&gt;public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num3;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((format == null) || (args == null))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException((format == null) ? "format" : "args");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char[] chArray = format.ToCharArray(0, format.Length);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int length = chArray.Length;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char ch = '\0';&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICustomFormatter formatter = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (provider != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; formatter = (ICustomFormatter) provider.GetFormat(typeof(ICustomFormatter));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;Label_004E:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num3 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num4 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (index &amp;lt; length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == '}')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '}'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == '{')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '{'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index--;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chArray[num4++] = ch;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (num4 &amp;gt; num3)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(chArray, num3, num4 - num3);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((index == length) || ((ch = chArray[index]) &amp;lt; '0')) || (ch &amp;gt; '9'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num5 = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num5 = ((num5 * 10) + ch) - 0x30;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (((ch &amp;gt;= '0') &amp;amp;&amp;amp; (ch &amp;lt;= '9')) &amp;amp;&amp;amp; (num5 &amp;lt; 0xf4240));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (num5 &amp;gt;= args.Length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new FormatException(Environment.GetResourceString("Format_IndexOutOfRange"));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((index &amp;lt; length) &amp;amp;&amp;amp; ((ch = chArray[index]) == ' '))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool flag = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num6 = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == ',')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == ' '))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == '-')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((ch &amp;lt; '0') || (ch &amp;gt; '9'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num6 = ((num6 * 10) + ch) - 0x30;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (((ch &amp;gt;= '0') &amp;amp;&amp;amp; (ch &amp;lt;= '9')) &amp;amp;&amp;amp; (num6 &amp;lt; 0xf4240));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((index &amp;lt; length) &amp;amp;&amp;amp; ((ch = chArray[index]) == ' '))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; object arg = args[num5];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string str = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch == ':')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num3 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num4 = index;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (true)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index == length)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ch = chArray[index];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (ch)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '{':&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '{'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '}':&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((index &amp;lt; length) &amp;amp;&amp;amp; (chArray[index] == '}'))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index--;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (num4 &amp;gt; num3)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;str = new string(chArray, num3, num4 - num3);&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Label_0253;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chArray[num4++] = ch;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;Label_0253:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ch != '}')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FormatError();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; index++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string str2 = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (formatter != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = formatter.Format(str, arg, provider);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (str2 == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (arg is IFormattable)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = ((IFormattable) arg).ToString(str, provider);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (arg != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = arg.ToString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (str2 == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str2 = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int repeatCount = num6 - str2.Length;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!flag &amp;amp;&amp;amp; (repeatCount &amp;gt; 0))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(' ', repeatCount);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(str2);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag &amp;amp;&amp;amp; (repeatCount &amp;gt; 0))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Append(' ', repeatCount);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Label_004E;&lt;br&gt;} 
&lt;p&gt;发现里面会有new string，这时候会有新的内存分配出现，也就是说string.format会产生很多临时的string对象，这个会费时间，同时也会使GC的工作量增加.既然这里面调用了stringbuilder来实现的，那为啥不直接调用stringbuilder.append来实现。于是我就把原来的实现改成了stringbuilder的append，同时设置它初始容量为我们预期的大小，通过测试，这部分的性能提高了十倍。于是性能问题解决了。&lt;/p&gt;
&lt;p&gt;最后，我觉得如果程序的性能很重要，而在这里面又经常有string.format的时候，还是改用stringbuilder.append来实现，虽然麻烦一些，代码也不好看，但是效果还是会很明显的。&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10259.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>AVI文件格式研究中碰到的一些问题的解决办法</title><link>http://webuc.net/chinahuman/archive/2008/08/25/10099.aspx</link><pubDate>Mon, 25 Aug 2008 14:54:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/08/25/10099.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10099.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/08/25/10099.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10099.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10099.aspx</trackback:ping><description>&lt;P&gt;最近在研究AVI文件格式的生成问题，碰到以下的问题，找到解决办法，共享如下：&lt;/P&gt;
&lt;P&gt;1.生成的文件格式的校验问题：&lt;/P&gt;
&lt;P&gt;因为是根据AVI RIFF File Refence这个文档来生成的，所以对错不知道。因此需要一个校验工具。偶觉得有两个工具不错：&lt;/P&gt;
&lt;P&gt;a. Gsport这个是暴风影音一类的工具会带的工具。如果格式有错误，它会提示出来。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_4.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=244 alt=image src="/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_thumb_1.png" width=243 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;b.VirtualDub 在这里面点工具菜单里面有十六进制编辑器，按Ctrl+R可以显示出RIFF的树，这样比较容易找出问题来。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_2.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=244 alt=image src="/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_AVI_D15F_image_thumb.png" width=229 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;2.一切都是按文档的说明来生成的，用播放器来播放是正常的，但是用如上的校验工具来看，里面有错位。在trunck列表里面，发现只有第一个是识别出来，后面的跳了一位无法识别。&lt;/P&gt;
&lt;P&gt;经研究发现是存在着奇偶对齐的问题，如果内容是奇数位，那么得在后面补上一位来对齐，但是这一位不能记在这个trunck的长度里面，否则解码器多读了一位可能会引起解码错误。&lt;/P&gt;
&lt;P&gt;计划把音频加入，以及功能完善化后，发布DLL供人调用。&lt;/P&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/10099.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>TFS下的一个问题解决（转）</title><link>http://webuc.net/chinahuman/archive/2008/07/03/10029.aspx</link><pubDate>Thu, 03 Jul 2008 13:36:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/07/03/10029.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/10029.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/07/03/10029.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/10029.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/10029.aspx</trackback:ping><description>&lt;P&gt;最近碰到了一个机子上的项目死活不能和TFS绑定，困扰很久，终于找到解决方案，原因很简单，成因也很简单，但是就是没有看到。 
&lt;P&gt;废话少说看原文：原文地址：&lt;A href="http://teamfoundation.blogspot.com/2007/12/offline-and-back-again-in-vs2008.html"&gt;http://teamfoundation.blogspot.com/2007/12/offline-and-back-again-in-vs2008.html&lt;/A&gt; 
&lt;P&gt;One of the most painful issues in VS2005 was its quirky offline support.&lt;BR&gt;&lt;BR&gt;One of the first features I have checked in Visual Studio 2008 was working offline. And what can I say - it (mostly) rocks!&lt;BR&gt;&lt;BR&gt;Let's do it step-by-step.&lt;BR&gt;
&lt;UL&gt;&lt;BR&gt;
&lt;LI&gt;You open the solution under source control and there is no connection to the server. What you get is the dialog, indicating offline condition&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_dialog.gif" border=0&gt;&lt;BR&gt;In Output window pane appears the log message, indicating detailed reason for the offline&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_output1.gif" border=0&gt;&lt;BR&gt;&lt;B&gt;Important note:&lt;/B&gt; Once the solution is opened offline, next time you open it in Visual Studio the dialog won't appear (but the output pane will show same message every time)&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_output2.gif" border=0&gt;&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;If you choose to change files in your solution/project when is offline, you will have a message that file is read-only once you save the changes. There is no indication of "under source control" status for offline projects or solutions&lt;BR&gt;&lt;BR&gt;&lt;B&gt;Important note:&lt;/B&gt; When working offline, you may edit or delete existing files or add new ones, and these types of changes will be supported when going "online" with TFS server. However, file renames are not supported&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;Now let's go online. You open solution in VS and you have connection - but tranistion to online will not happen automatically. To sync solution/project back online you should use "&lt;I&gt;Go Online&lt;/I&gt;" menu, that available on right-click in Solution Explorer or in "File"-&amp;gt;"Source Control" menu.&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_online_menu.gif" border=0&gt;&lt;BR&gt;Once you hit "Go Online" requested, the dialog with changes "Go Online" dialog will appear detailing the changes performed while online. The dialog shows files and&lt;BR&gt;changes (add/edit/delete) performed while offline. You may choose not to pend the changes for specific files (then the file will remain writable, but will not have pending changes).&lt;BR&gt;&lt;IMG src="http://www.attrice.info/images/blog/offline_online_dialog.gif" border=0&gt;&lt;BR&gt;&lt;B&gt;Important note:&lt;/B&gt; If you did not perform any changes while offline, the appropriate message will appear&lt;BR&gt;Once online, the pending changes indications will appear in Solution Explorer.&lt;BR&gt;&lt;BR&gt;
&lt;LI&gt;If you want to unbind your solution/project from source control, all you need to do is to go to "Source Control"-&amp;gt;"Change Source Control" menu. The message will appear asking you whether you want to go online or permanently unbind your solution.&lt;BR&gt;&lt;BR&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;BR&gt;&lt;BR&gt;But of course, there were several "&lt;I&gt;Things I did not like&lt;/I&gt;":&lt;BR&gt;
&lt;OL&gt;&lt;BR&gt;
&lt;LI&gt;No cancel on Offline dialog - either go offline or ...?&lt;BR&gt;
&lt;LI&gt;No indication for source controlled files in Solution Explorer in offline mode (similar to that of VSS) - only read-only flag on file serves as an indication&lt;BR&gt;
&lt;LI&gt;"Change Source Control" dialog does not allow one to "Disconnect", you can only "Unbind; so going offline happens only when server is not available&lt;BR&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;BR&gt;&lt;BR&gt;Overall, I should say I liked VS2008 experience very much (especially as compared with previous version). I can feel that feedback on TFS2005 offline experience was not wasted!&lt;img src ="http://webuc.net/chinahuman/aggbug/10029.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>在服务里面弹出一个窗口到用户的桌面上</title><link>http://webuc.net/chinahuman/archive/2008/05/04/9966.aspx</link><pubDate>Sun, 04 May 2008 07:17:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2008/05/04/9966.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9966.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2008/05/04/9966.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9966.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9966.aspx</trackback:ping><description>&lt;P&gt;曾几何时，服务里面弹出一个窗口到桌面上不再是那么地容易了：以前只要把服务设置为允许和桌面交互就可以直接在服务启动的时候，把一个窗口弹给用户。但是现在在vista(其它的OS 下没有测试，未知)下要弹出这样的窗体，首先会弹出一个提示框提示是否接否一个服务弹出来的消息，点接受后，才会在一个全灰的桌面里面弹出这个窗口。不用想，这样的用户体验，肯定是会被直接PASS。原因很简单，因为不同的用户间的桌面是不一样的，服务用的是System的权限，在vista里面是Session0，而用户的帐户不是这个（肯定大于0）。&lt;/P&gt;
&lt;P&gt;看来，想弹出一个窗体，需要另一个程序来作辅助了。解决方案有两种：&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;开发一个程序A在启动的时候，随系统启动，并监控指定文件M，服务S有消息的时候，放在文件M里，A 感受了文件变化了，就去读这个文件里的内容，根据规则来作对应的动作。坏处很明显，当用户为了让系统跑得快的时候，这种自启动文件很容易被砍掉，导致了有些功能莫名奇妙地不可用。 
&lt;LI&gt;同样地，也是开发一个程序A，用CreateProcessAsUser这个API来创建这个A ，并且发送到用户的桌面上去。好处是可以把这个A和服务S 放在同一个程序文件里面，根据不同的参数来启动不同的功能。这样用户除非是删除整个服务，否则不会有部分功能能用，又有部分功能不能用的问题。&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;现在来看看第二种方案，要想用CreateProcessAsUser这个API ，有这样几个步骤：&lt;/P&gt;
&lt;P&gt;１.取得用户的令牌（Token）&lt;/P&gt;
&lt;P&gt;２.指定好虚拟桌面&lt;/P&gt;
&lt;P&gt;３.调用API创建这个用户进程。&lt;/P&gt;
&lt;P&gt;在取得用户令牌的时候，又有几个方法：&lt;/P&gt;
&lt;P&gt;１.从用户的进程上去剥&lt;/P&gt;
&lt;P&gt;２.先用WTSGetActiveConsoleSessionId得到用户会话ID，再用WTSQueryUserToken这个API去取。&lt;/P&gt;
&lt;P&gt;不过在vista下面,服务里面的WTSGetActiveConsoleSessionId这个API得到的总是0，也就是Session0,用这个创建出来的进程，还是属于一个服务进程。(而且这个API是XP以及以后的系统才会提供的，在早点的系统上就会调用失败)所以我们只好从用户的进程上去找，用户登录的时候，一定会有的进程就是：explorer.exe，这样可以遍历所有的进程去找到这个（如果是多人同时登录这个系统里，我也不知道该怎么办了，不知道有没有高人指点一下）。&lt;/P&gt;
&lt;P&gt;这样创建出来的用户进程，在进程列表里面可以看到是活动用户的。但是如果在这里面使用一下文件选择框，或是去取一些系统目录，比如说用户的桌面，用户的收藏夹等，都会得到空。这时候因为没有指定用户环境造成的。使用CreateEnvironmentBlock这个API就可以搞定了。&lt;/P&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9966.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>PowerShell的Cmdlet的生存周期和执行顺序</title><link>http://webuc.net/chinahuman/archive/2007/09/24/9501.aspx</link><pubDate>Mon, 24 Sep 2007 15:17:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2007/09/24/9501.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9501.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2007/09/24/9501.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9501.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9501.aspx</trackback:ping><description>&lt;P&gt;认清了Cmdlet的生存周期和执行的顺序对于我们后续的开发和使用有相当重要的意义，因为它直接决定了到时候该怎么开发，能实现哪些功能（比如说一直需要运行的程序，就不适合用Cmdlet来完成）。&lt;/P&gt;
&lt;DIV class=csharpcode&gt;
&lt;P&gt;先让我们看一下Cmdlet的生存周期:&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt; [Cmdlet(VerbsCommon.Add, &lt;SPAN class=str&gt;"Test"&lt;/SPAN&gt;)] &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; AddTest: Cmdlet&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; BeginProcessing()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"BeginProcessing"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ProcessRecord()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"ProcessRecord"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.ProcessRecord();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; EndProcessing()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"EndProcessing"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.EndProcessing();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; StopProcessing()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;            WriteObject(&lt;SPAN class=str&gt;"StopProcessing"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.StopProcessing();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;我们可以发现，结果是：&lt;/PRE&gt;
&lt;P&gt;BeginProcessing&lt;BR&gt;ProcessRecord&lt;BR&gt;EndProcessing 
&lt;P&gt;基本上和我们猜测的一样的，初始化，执行，完成 
&lt;P&gt;可以判断StopProcessing这是在Cmdlet被中止的时候才会触发的。&lt;/P&gt;
&lt;P&gt;再让我们看一下Cmdlet的生存周期:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TaskManager&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; runCount = 0;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; Run()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        { &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; runCount ++;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    [Cmdlet(VerbsCommon.Add, &lt;SPAN class=str&gt;"Test"&lt;/SPAN&gt;)] &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; AddTest: Cmdlet&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ProcessRecord()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;            WriteObject(TaskManager.Run());&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.ProcessRecord();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    }&lt;/PRE&gt;运行这个Cmdlet，多次运行，以及关掉PS后，重新加载后执行的情况来看，我们可以看出：Cmdlet所在程序集从Add-PSSnapIn加载到PowerShell里后,也就是这个DLL被启动起来了,直到这个PowerShell被关掉,完成它的一个生命周期.也就是说,在这运行过程中,我们可以把很多数据记录在静态成员里面,比如说运行的记录等.&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;
&lt;/DIV&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9501.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>PowerShell的CmdLet开发的HelloWorld</title><link>http://webuc.net/chinahuman/archive/2007/09/18/9483.aspx</link><pubDate>Tue, 18 Sep 2007 09:32:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2007/09/18/9483.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9483.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2007/09/18/9483.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9483.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9483.aspx</trackback:ping><description>&lt;p&gt;安装完windows Vista SDK后,终于可以开始CmdLet的开发了.如果安装了Samples的同学,可以直接去看示例:X:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\SysMgmt\WindowsPowerShell 其中X是PS所在的安装盘.下面让偶手把手地说一下该怎么建立一个CmdLet吧:&lt;/p&gt; &lt;p&gt;1.打开VS2005,创建一个windows的运行库.&lt;/p&gt; &lt;p&gt;2.添加引用:C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll&lt;/p&gt; &lt;p&gt;3.新建一个类文件,同时&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;using System.Management.Automation;&lt;br&gt;using System.ComponentModel;(这个在安装时会用到)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;4.下面开始写代码了:&lt;/p&gt;&lt;font color="#76c592"&gt;//先来完成cmdlet的实体类&lt;/font&gt;&amp;nbsp;&lt;br&gt; &lt;p&gt;[Cmdlet(VerbsCommon.Get, "HelloWorld")] &lt;font color="#79dfb7"&gt;//大胆地猜测一下,PS在加载cmdlet程序集的时候,是用反射的方式来识别的,反射的时候就是靠这个attribute来实现,这里面有两个参数,第一个是动作,后一个是名字.这是cmdlet的命名方式:动词+名词&lt;/font&gt;&lt;br&gt;public class ExecuteShell : Cmdlet &lt;font color="#76c592"&gt;// 继承自cmdlet的基类&lt;br&gt;&lt;/font&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string argus;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Parameter(Position = 0)]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#76c592"&gt;//大家可以发现很有意思在这里面,随处都可以看到attribute,这里指写了第一个参数,直接就反射到类对应的属性上了.&lt;/font&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ValidateNotNullOrEmpty]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Args&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return argus; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { argus = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void ProcessRecord()&lt;/p&gt;&lt;font color="#76c592"&gt;//处理请求,我们我这里只是简单地输出一下信息.&lt;/font&gt;&amp;nbsp;&lt;br&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (argus != null &amp;amp;&amp;amp; argus.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteCommandDetail("Hello World:" + argus);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;} &lt;p&gt;&lt;font color="#76c592"&gt;//再来看看cmdlet的安装类&lt;/font&gt;&lt;/p&gt; &lt;p&gt;[RunInstaller(true)] &lt;font color="#76c592"&gt;//又是这种attribute&lt;/font&gt;&lt;/p&gt; &lt;p&gt;public class HelloWordSnapIn: PSSnapIn &lt;br&gt;{&lt;br&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Create an instance of the GetProcPSSnapIn01&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PSclient()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : base()&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Get a name for this PowerShell snap-in. This name will be used in registering&lt;br&gt;&amp;nbsp;&amp;nbsp; /// this PowerShell snap-in.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// 注意这里面的名字最为重要在下面将要讲到&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; public override string Name&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "HelloWordSnapIn";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Vendor information for this PowerShell snap-in.&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; public override string Vendor&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "BrainIron";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Gets resource information for vendor. This is a string of format: &lt;br&gt;&amp;nbsp;&amp;nbsp; /// resourceBaseName,resourceName. &lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; public override string VendorResource&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "HelloWordSnapIn,BrainIron";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&lt;font color="#76c592"&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; /// Description of this PowerShell snap-in.&lt;br&gt;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; public override string Description&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "This is a PowerShell snap-in that includes the Get-HelloWorld cmdlet. this is a demo, design by Brian";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;} &lt;p&gt;编译生成:HelloWorldCmdLet.dll&lt;/p&gt; &lt;p&gt;6.这时候该安装了:使用Installutil.exe HelloWorldCmdLet.dll来把安装它.Installutil.exe如果你找不到,那么应该在SDK的BIN目录里面肯定可以找得到.&lt;/p&gt; &lt;p&gt;7.这时候打开PS,使用Get-HelloWorld 命令会发现提示不支持这个命令.这时候要用:Add-PSSnapin&amp;nbsp; HelloWordSnapIn 来把它注册到PS的控制台中,这个命令的后面的那个名字就是我上面说的重要的名字,而不是类名.然后再用Get-HelloWorld 命令就可以看到成果了.&lt;/p&gt; &lt;p&gt;8.调试.因为程序要先注册到PS中,PS才能调用,所以好像不太好调试,其实可以用附加到进程的方式来调试.&lt;/p&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9483.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>铁匠</dc:creator><title>PowerShell的开发初步</title><link>http://webuc.net/chinahuman/archive/2007/09/14/9469.aspx</link><pubDate>Fri, 14 Sep 2007 05:33:00 GMT</pubDate><guid>http://webuc.net/chinahuman/archive/2007/09/14/9469.aspx</guid><wfw:comment>http://webuc.net/chinahuman/comments/9469.aspx</wfw:comment><comments>http://webuc.net/chinahuman/archive/2007/09/14/9469.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://webuc.net/chinahuman/comments/commentRss/9469.aspx</wfw:commentRss><trackback:ping>http://webuc.net/chinahuman/services/trackbacks/9469.aspx</trackback:ping><description>&lt;P&gt;PowerShell是微软最新推出的基于脚本的管理工具,用脚本管理的好处就是便于写批处理命令.相象一下大的IT公司里面要把数千台的服务器上的没有响应的IIS重启一下,那是一种多么大的工作量,有了PowerShell后,那就显得轻松很多了,先一个命令查出哪台没有响应了,再发送重启命令,一切都可以自动化地完成.同时容易适应不断变化着的意外情况可以轻松地调整脚本.&lt;/P&gt;
&lt;P&gt;因为工作需要,开始学习和使用PoswerShell来做应用开发.目标是把当前的一些功能封装成cmdlet(command-let小命令),同时研究如何在C#里面去调用cmdlet.先看看资源:&lt;/P&gt;
&lt;P&gt;PowerShell的下载地址:&lt;A title=http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx"&gt;http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;请注意你当前的系统以及CPU类型选择下载.&lt;/P&gt;
&lt;P&gt;微软的PowerShell官方BLOG:&lt;A title=http://blogs.msdn.com/powershell/ href="http://blogs.msdn.com/powershell/"&gt;http://blogs.msdn.com/powershell/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;MSDN中的相应说明:&lt;A title=http://msdn2.microsoft.com/en-us/library/aa139691.aspx href="http://msdn2.microsoft.com/en-us/library/aa139691.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa139691.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;开发的时候,需要PowerShell的SDK,可以从这里下载(现在只有for vista的):&lt;A title=http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&amp;amp;displaylang=en href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&amp;amp;displaylang=en&lt;/A&gt;&amp;nbsp;(SDK又是那种先下个小文件再下大文件的那种,比较郁闷)&lt;/P&gt;
&lt;P&gt;再看一眼传说中的PowerShell,和原来的CMD很像:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://webuc.net/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_PowerShell_C7BC_image.png" atomicselection="true"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=153 alt=image src="/images/webuc_net/chinahuman/484/o_WindowsLiveWriter_PowerShell_C7BC_image_thumb.png" width=240 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;输入help就可以看到所有的命令,包含CMD的命令和一些cmdlet,不过就这些就够我们翻一会儿了.&lt;/P&gt;
&lt;P&gt;先写到这里,其它的在下面的日子里,会渐渐地写完.&lt;/P&gt;&lt;img src ="http://webuc.net/chinahuman/aggbug/9469.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>
