<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1077856587402283212</id><updated>2024-08-30T15:47:15.213+08:00</updated><category term="Software"/><category term=".NET"/><category term="WEB"/><category term="Others"/><category term="Database"/><category term="Emotion"/><category term="Game"/><category term="Javascript"/><category term="Combine Cycle"/><category term="Community"/><category term="Design"/><category term="Hardware"/><category term="Turbine"/><title type='text'>sacranto&#39;s Blog</title><subtitle type='html'>Engineering, Programming and Feeling</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default?start-index=26&amp;max-results=25'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-5309210768623270518</id><published>2007-06-25T14:15:00.001+08:00</published><updated>2007-06-25T14:15:29.855+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Emotion"/><category scheme="http://www.blogger.com/atom/ns#" term="Others"/><title type='text'>n475被和谐了!</title><content type='html'>&lt;p&gt;昨天乘n475从上海回杭州。发现它的运行时间增加了十五分钟。才发现铁道部的确在努力构建和谐火车。此车原先的运行时间是1742-1910。 &lt;p&gt;现在改在1737发车，比沪杭加动车前提前了五分钟，后面跟着新加的动车d677，1750-1908。于是我很简单的推算，475提早五分钟发车是为了提前五分钟1905到杭州。很开心的走上bsp，觉得bsp比动车好，一排只有四个人，还便宜六快钱，不少哦，10几%了。刚开了一会儿就觉得不对劲，这个速度不象原来的，在慢慢摇。果不其然，1745火车便停下了，预感不会是为了避让动车吧。左等右等，大概十分钟后窗边白色呼宵而过。最后475 1930才到杭州。  &lt;p&gt;动车快我没有意见，但是没有必要这样吧，完全可以把动车的开行时间和475换一下或者直接推迟开车时间，也不必让bsp停十几分钟来证明动车快吧，bsp也可以用到更需要的地方吧。但据说bsp和25t也很多地方想要吧。其实我想到的解释很简单，显示动车很快，促进和谐吧。至少这样搞下次我会座动车了。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/5309210768623270518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/5309210768623270518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/5309210768623270518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/5309210768623270518'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/06/n475.html' title='n475被和谐了!'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-7837277932825616662</id><published>2007-05-31T14:33:00.001+08:00</published><updated>2007-05-31T14:42:28.585+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Others"/><title type='text'>新版本的中文Windows Live桌面产品发布</title><content type='html'>&lt;p&gt;包括Live Writer、Live Mail和Live Messanger。&lt;/p&gt; &lt;p&gt;下载地址：&lt;/p&gt; &lt;p&gt;&lt;a title=&quot;http://get.live.com/betas/home&quot; href=&quot;http://get.live.com/betas/home&quot;&gt;http://get.live.com/betas/home&lt;/a&gt;&lt;/p&gt; &lt;p&gt;如果想访问英文主页和下载英文产品&lt;/p&gt; &lt;p&gt;地址：&lt;a title=&quot;http://get.live.com/betas/home&quot; href=&quot;http://get.live.com/en-us/betas/home&quot;&gt;http://get.live.com/en-us/betas/home&lt;/a&gt;&lt;/p&gt; &lt;p&gt;其中Live Writer完美支持Blogger的Label，不错！&lt;/p&gt; &lt;p&gt;如果使用过程有什么问题，这个&lt;a href=&quot;http://get.live.com/betas/installer_release_notes&quot;&gt;地方&lt;/a&gt;给了一些处理方法。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/7837277932825616662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/7837277932825616662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7837277932825616662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7837277932825616662'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/05/windows-live.html' title='新版本的中文Windows Live桌面产品发布'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-514201841343192640</id><published>2007-04-30T15:06:00.001+08:00</published><updated>2007-04-30T16:06:13.519+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><title type='text'>Log4net(五)— Appenders(记录方式)</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;原文地址：&lt;a href=&quot;http://logging.apache.org/log4net/release/manual/introduction.html#appenders&quot; target=&quot;_blank&quot;&gt;Appenders&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;选择和禁止记录请求只是log4net框架的一部份。log4net允许将记录请求输出到不同的目的地。在log4net中，输出目的地叫做Appender（记录方式）。记录方式必须继承log4net.Appenders.IAppender接口。&lt;/p&gt; &lt;p&gt;log4net中定义了下面的记录方式： (链接到英文的log4net SDK)  &lt;p&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;95%&quot; border=&quot;1&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;类型 &lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;描述 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.AdoNetAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.AdoNetAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录通过SQL语句或者存储过程保存到数据库中 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.AnsiColorTerminalAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.AnsiColorTerminalAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录进行颜色高亮，并输出到ANSI终端窗口 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.AspNetTraceAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.AspNetTraceAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;将记录输出到ASP追踪页面，他们被返回到ASP页面或者追踪页面的底部。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.BufferingForwardingAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.BufferingForwardingAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;缓存送到子记录器的记录 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.ColoredConsoleAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.ColoredConsoleAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到程序的控制台。事件信息可以输出到标准输出流，也可以输出到标准错误流。事件可以包含为每个等级定义的结构化文本和背景颜色。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://log4net.Appender.ConsoleAppender&quot; target=&quot;_blank&quot;&gt;log4net.Appender.ConsoleAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到程序的控制台。事件信息可以输出到标准输出流，也可以输出到标准错误流。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.EventLogAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.EventLogAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到Windows事件日志 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.FileAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.FileAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到文件系统的文件中 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.ForwardingAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.ForwardingAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录送到子记录器 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.LocalSyslogAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.LocalSyslogAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到本地系统日志服务（UNIX） &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.MemoryAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.MemoryAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录保存到内存缓存中 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.NetSendAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.NetSendAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把时间输出到Windows消息服务，这些消息在用户终端中显示 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.OutputDebugStringAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.OutputDebugStringAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到调试器。如果程序没有调试器，将会输出到系统调试器。如果系统没有调试器并且系统调试器被禁用，记录被忽略 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.RemoteSyslogAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.RemoteSyslogAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录通过UDP网络输出到远程系统记录服务。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.RemotingAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.RemotingAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;通过.NET Remoting把记录输出到远程接收器 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.RollingFileAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到文件系统的文件中。RollingFileAppender可以通过配置日期或者文件大小的限制把记录配置输出到多个文件。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.SmtpAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.SmtpAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录发送到制定邮箱地址 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.SmtpPickupDirAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.SmtpPickupDirAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把SMTP消息记录到制定目录的文件中，这些文件可已通过像IIS SMTP代理这样的SMTP代理读取和发送 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.TelnetAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.TelnetAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;用户通过Telnet连接来获取记录 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.TraceAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.TraceAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录输出到.NET追踪系统 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;&lt;a href=&quot;http://logging.apache.org/log4net/release/sdk/log4net.Appender.UdpAppender.html&quot; target=&quot;_blank&quot;&gt;log4net.Appender.UdpAppender&lt;/a&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width=&quot;284&quot;&gt; &lt;p&gt;把记录当成无状态UDP数据包发送到使用UDP客户端的远程主机或者组。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;一个记录器能够使用道中输出方式。&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;每条记录器允许的记录请求将被输出到记录器所有的记录方式，包括记录器层次结构中上级的记录器的记录方式。&lt;/font&gt;换句话说，记录方式具备继承加成的特性。例如，如果在根控制器上增加了一个控制台记录方式，那么所有被允许的记录请求将至少被输出到控制台。如果记录器增加了一个文件记录方式X，所有X和X的后代通过的记录请求将被输出到文件和控制台。可以将记录器的additivity属性标记为false来避免记录方式的集成加成特性。  &lt;p&gt;下面总结了记录方式的加成特性。  &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;记录器X的记录语句将会输出到X和他祖先的所有记录方式。这就是“继承加成”&lt;/font&gt;  &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;但是，如果X的祖先Y，设置了additivity属性为false，那么X的的记录将会输出到X到Y（包括X和Y）之间的所有记录方式，但不会输出到Y的祖先的记录方式。&lt;/font&gt;  &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;记录器的默认additivity属性为true。&lt;/font&gt;  &lt;p&gt;下面是一个例子  &lt;p&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;95%&quot; border=&quot;1&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt; &lt;p&gt;记录器名 &lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;94&quot;&gt; &lt;p&gt;记录方式 &lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;98&quot;&gt; &lt;p&gt;additivity属性 &lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;99&quot;&gt; &lt;p&gt;输出目标 &lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;284&quot;&gt; &lt;p&gt;备注 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt; &lt;p&gt;root&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;94&quot;&gt; &lt;p&gt;A1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;98&quot;&gt; &lt;p&gt;不适用 &lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;99&quot;&gt; &lt;p&gt;A1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;284&quot;&gt; &lt;p&gt;root没有继承任何输出方式 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt; &lt;p&gt;x&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;94&quot;&gt; &lt;p&gt;A-x1, A-x2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;98&quot;&gt; &lt;p&gt;true&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;99&quot;&gt; &lt;p&gt;A1, A-x1, A-x2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;284&quot;&gt; &lt;p&gt;x和root的记录方式 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt; &lt;p&gt;x.y&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;94&quot;&gt; &lt;p&gt;none&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;98&quot;&gt; &lt;p&gt;true&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;99&quot;&gt; &lt;p&gt;A1, A-x1, A-x2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;284&quot;&gt; &lt;p&gt;x和root的记录方式 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt; &lt;p&gt;x.y.z&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;94&quot;&gt; &lt;p&gt;A-xyz1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;98&quot;&gt; &lt;p&gt;true&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;99&quot;&gt; &lt;p&gt;A1, A-x1, A-x2, A-xyz1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;284&quot;&gt; &lt;p&gt;x, x.y.z和root的记录方式 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt; &lt;p&gt;security&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;94&quot;&gt; &lt;p&gt;A-sec&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;98&quot;&gt; &lt;p&gt;false&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;99&quot;&gt; &lt;p&gt;A-sec&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;284&quot;&gt; &lt;p&gt;因为additivity属性为false，没有任何记录方式累加 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt; &lt;p&gt;security.access&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;94&quot;&gt; &lt;p&gt;none&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;98&quot;&gt; &lt;p&gt;true&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;99&quot;&gt; &lt;p&gt;A-sec&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;284&quot;&gt; &lt;p&gt;因为security的additivity属性为false，因此只有security的记录方式 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/514201841343192640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/514201841343192640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/514201841343192640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/514201841343192640'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/log4net-appenders.html' title='Log4net(五)— Appenders(记录方式)'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-6705271383848116876</id><published>2007-04-29T22:26:00.001+08:00</published><updated>2007-04-29T22:41:57.139+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><title type='text'>log4net（四） — Logger（记录器）</title><content type='html'>&lt;p&gt;前三节主要翻译和学习了配置文件的写法。从这一节将计划翻译Logger（第四节）、记录方式（第五节）、布局（第六节）和过滤器（第七节）。&lt;/p&gt; &lt;p&gt;原文地址：&lt;a href=&quot;http://logging.apache.org/log4net/release/manual/introduction.html#hierarchy&quot; target=&quot;_blank&quot;&gt;Loggers and Appenders&lt;/a&gt;&lt;/p&gt; &lt;p&gt;log4net主要包含三个主要部分，记录器(loggers)、记录方式（appenders）和布局（layouts）。通过这三个部件，开发者可以根据消息类型和等级记录消息，并在运行时刻控制消息的格式和输入方式。这些部件使用过滤器(filters)控制记录方式的行为，使用renderers把对象转换为字符串。  &lt;h1&gt;&lt;u&gt;&lt;font color=&quot;#800000&quot; size=&quot;4&quot;&gt;&lt;strong&gt;&lt;strong&gt;Logger hierarchy（记录器层次结构）&lt;/strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/h1&gt; &lt;p&gt;使用记录API相比System.Console.WriteLine最大的优势在于可以禁用某些特定消息并让其他消息畅通无阻。它把所有可能记录的消息按开发者规定的元素进行归类。  &lt;p&gt;记录器是已命名的实体。名字大小写敏感并且遵守夏磊层次命名规则：  &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;如果记录器A的名字以其他记录器B的名字加上.为前缀，那么它就是其他记录器的后代（A是B的后代）。记录器被称为他直接子记录器的父亲。 &lt;/font&gt; &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;这个层次结构和.NET中的命名空间、类层次结构类似。在下面我们可以看见这样将非常方便。&lt;/font&gt;  &lt;p&gt;例如：名为&quot;Foo.Bar&quot;的记录器是&quot;Foo.Bar.Baz&quot;记录器的父亲。类似的，”System”是&quot;System.Text&quot;的父亲和&quot;System.Text.StringBuilder&quot;的祖先。这种命名方式对于程序来说是相当熟悉的。  &lt;p&gt;根记录器（root logger）位于层次结构的顶端。它在以下三方面表现出特别之处。  &lt;p&gt;1. 它总是存在的。  &lt;p&gt;2. 他不能通过名字获取。  &lt;p&gt;3. 它总被指定在某个等级。  &lt;p&gt;记录器可以通过log4net.LogManger类的静态方法获得。GetLogger方法以欲获取的记录器名称为参数，如下所示： &lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt; log4net&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; LogManager&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; ILog GetLogger(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; name);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; ILog GetLogger(Type type);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;GetLogger方法也可以接受欲获取记录器的完整类型为名称的Type类型参数。 
&lt;p&gt;记录器返回ILog接口，它代表了返回给开发者的记录器。ILog接口定义如下 &lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt; log4net&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;interface&lt;/span&gt; ILog&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;rem&quot;&gt;/* Test if a level is enabled for logging */&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IsDebugEnabled { get; }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IsInfoEnabled { get; }&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IsWarnEnabled { get; }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IsErrorEnabled { get; }&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IsFatalEnabled { get; }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;rem&quot;&gt;/* Log a message object */&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Debug(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Info(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Warn(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Error(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Fatal(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message);&lt;/pre&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;rem&quot;&gt;/* Log a message object and exception */&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Debug(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message, Exception t);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Info(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message, Exception t);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Warn(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message, Exception t);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Error(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message, Exception t);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Fatal(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; message, Exception t);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;rem&quot;&gt;/* Log a message string using the System.String.Format syntax */&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; DebugFormat(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; InfoFormat(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; WarnFormat(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; ErrorFormat(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; FatalFormat(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;rem&quot;&gt;/* Log a message string using the System.String.Format syntax */&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; DebugFormat(IFormatProvider provider, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; InfoFormat(IFormatProvider provider, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; WarnFormat(IFormatProvider provider, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; ErrorFormat(IFormatProvider provider, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; FatalFormat(IFormatProvider provider, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; format, &lt;span class=&quot;kwrd&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;记录器可以被指定等级。等级是log4net.Core.Level类的实例。下列等级依照递增优先级被定义。 
&lt;p&gt;ALL DEBUG INFO WARN ERROR FATAL OFF 
&lt;p&gt;如果一个记录器没有被指定等级，那么它继承它最近的父类的等级。 
&lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;未指定等级的记录器X 继承 从X向上到根记录器的路线中第一个被直接指定等级的记录器的等级。&lt;/font&gt; 
&lt;p&gt;为了保证所有的记录器能够继承一个等级，所以根记录器总被指定一个等级，默认为DEBUG。下面4个表格是根据上面规则分配和继承等级的例子。 
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;95%&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;记录器名 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;被指定等级 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;继承等级 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;none&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;X.Y&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;none&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Proot &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;X.Y.Z&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;none&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;proot&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;上面例子中只有根记录器被指定了等级Proot，因此其他记录器X, X.Y, X.Y.Z均继承了等级Proot。 
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;95%&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;记录器名 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;被指定等级 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;继承等级 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;X.Y&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Pxy&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Pxy&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;X.Y.Z&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;Pxyz&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;189&quot;&gt;
&lt;p&gt;pxyz&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;上面的例子中，每个记录器都被指定了等级，因此没有继承的等级。 &lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;95%&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;记录器名 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;被指定等级 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;继承等级 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;X.Y&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;none&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;X.Y.Z&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Pxyz&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;pxyz&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;上面的例子中，根记录器、X记录器、X.Y.Z记录器分别被分配了等级Proot、Px、Pxyz。X.Y记录器继承父亲X的等级Px。 
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;95%&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;记录器名 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;被指定等级 &lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;继承等级 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Proot&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;X&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;X.Y&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;none&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;X.Y.Z&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;none&lt;/p&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;180&quot;&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Px&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;上面的例子中，根记录器、X记录器分别被分配了等级Proot、Px。X.Y和X.Y.Z记录器继承它们最近的被指定等级的记录器的等级。 
&lt;p&gt;记录请求通过调用记录器实例（使用log4net.ILog）的printing方法调用，printing方法包括Debug, Info, Warn, Error和Fatal。 
&lt;p&gt;通常，printing方法决定了记录请求的等级。例如，存在记录器实例log，那么log.Info(“…”)将发出等级为INFO的记录请求。 
&lt;p&gt;如果记录请求的等级高于或者等于记录器的等级将被允许。相反，请求将被禁止。没有指定等级的记录器将从层次结构中继承一个。这个规则归纳如下。 
&lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;L&amp;gt;=K时，等级（指定或者继承）为K的记录器允许等级为L的记录请求。&lt;/font&gt; 
&lt;p&gt;这条规则是log4net的核心。它基于有序的规则，标准等级规则下，DEBUG&amp;lt;INFO&amp;lt;WARN&amp;lt;ERROR&amp;lt;FATAL。调用使用相同名称为参数的log4net.LogManager.GetLogger方法将返回完全相同的记录器的应用。例如 &lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;ILog x = LogManager.GetLogger(&lt;span class=&quot;str&quot;&gt;&quot;wombat&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;ILog y = LogManager.GetLogger(&lt;span class=&quot;str&quot;&gt;&quot;wombat&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;X和y指向完全相同的记录器。 
&lt;p&gt;因此，配置一个记录器并在代码中的某个地方不通过传递引用而获取相同的记录器成为可能。与生物学的父亲总是先于后代的基本原理不同，log4net记录器能够以任何顺序被配置。但是，即使父记录器晚于子记录器被配置，他也总是先被找到并链接到它的后代。 
&lt;p&gt;log4net环境通常在程序初始化时被配置。通常偏爱使用配置文件的方式，这个将在后面讨论（&lt;font color=&quot;#0000ff&quot;&gt;翻译调换了顺序，配置见前几节&lt;/font&gt;） 
&lt;p&gt;log4net使通过组件命名记录器很简单。它可以通过在每个类中实例化记录器实现，记录器的名字为每个类的完整名称。这是一个定义记录器有用和直接的方法。随着输出的记录带有产生它的记录器的名字，这种命名规则简化了确认记录消息的来源方法。但是，这只是一种普遍的命名记录器的方法。Log4net不限制其他的命名方式。开发人员可以任意给记录器取名。 
&lt;p&gt;然而，按所在类命名记录器是目前已知的最好的方法。他给开发者明确指出了记录消息的来源。更重要的是这样可是使用程序的设计来设计记录器的层次结构。希望其中一些思想已进入到程序的设计中。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/6705271383848116876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/6705271383848116876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/6705271383848116876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/6705271383848116876'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/log4net-logger.html' title='log4net（四） — Logger（记录器）'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2028648725934344230</id><published>2007-04-28T15:44:00.001+08:00</published><updated>2007-04-28T15:47:55.547+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><title type='text'>Log For log4net (三) — 配置语法</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;接&lt;a href=&quot;http://sacranto.blogspot.com/2007/04/log-for-log4net_27.html&quot; target=&quot;_blank&quot;&gt;上篇&lt;/a&gt;  &lt;p&gt;注：这是log4net配置文档的最后一部份，描述了配置文档的语法  &lt;p&gt;对于其中的renderer的意义不是很清楚  &lt;p&gt;原文地址：&lt;a href=&quot;http://logging.apache.org/log4net/release/manual/configuration.html&quot;&gt;log4net Manual - Configuration&lt;/a&gt;  &lt;p&gt;log4net使用log4net.Config.XmlConfigurator配置读取器来解析XML，这一部分描述XmlConfigurator的语法  &lt;p&gt;下面是一个有效的XML配置，根元素必须是&amp;lt;log4net&amp;gt;，这并不意味着这个元素不能嵌入到其他元素里面。详见配置文件节。&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger [%ndc] - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;INFO&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;log4net&amp;gt;节支持下列属性&lt;/font&gt;
&lt;h5&gt;&lt;/h5&gt;&lt;strong&gt;debug&lt;/strong&gt;：可选属性，值为true或者false，默认为false。指定为true时允许log4net的内部调试&lt;br&gt;&lt;strong&gt;update&lt;/strong&gt;：可选属性，值为Merge或者Overwrite，默认为Merge。指定为Overwrite时将在应用此配置之前重置库中的配置。&lt;br&gt;&lt;strong&gt;threshold&lt;/strong&gt;：可选属性，值必须是已在库中已注册的等级名，默认为ALL。这个属性用来在整个库中限制需要记录的等级，不管记录到任何地方。&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;log4net&amp;gt;支持下列子元素&lt;/font&gt;
&lt;h5&gt;&lt;/h5&gt;&lt;strong&gt;appender&lt;/strong&gt;：0或者多个，定义记录方式（appender）&lt;br&gt;&lt;strong&gt;logger&lt;/strong&gt;：0或者多个，定义记录器（logger）的配置。&lt;br&gt;&lt;strong&gt;renderer&lt;/strong&gt;：0或者多个，定义一个对象renderer（不知道怎么意思）&lt;br&gt;&lt;strong&gt;root&lt;/strong&gt;：0个或者1个，定义根记录器&lt;br&gt;&lt;strong&gt;param&lt;/strong&gt;：0或者多个，库特定参数。&lt;/p&gt;
&lt;h4&gt;&lt;u&gt;&lt;font color=&quot;#800000&quot;&gt;Appenders&lt;/font&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p&gt;Appenders只可以定义为&amp;lt;log4net&amp;gt;元素的子元素，每个appender（记录方式）都必须被唯一的命名，appender的实现类型也必须制定。下面的例子定义了一个log4net.Appender.ConsoleAppender类型的记录器，即控制台记录方式&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger [%ndc] - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;appender&amp;gt;节支持下列属性&lt;/font&gt;
&lt;h5&gt;&lt;/h5&gt;&lt;strong&gt;name&lt;/strong&gt;：必须属性，字符串表示的appender名称，名称必须在所有记录方式中唯一，它在记录器的&amp;lt;appender-ref&amp;gt;元素中被引用，用来指定记录方式。&lt;br&gt;&lt;strong&gt;type&lt;/strong&gt;：必须属性，值为记录器类型名，如果记录器不在log4net组件集中，必须给出完整的组件集名称。&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;appender&amp;gt;节支持下列子元素&lt;br&gt;&lt;/font&gt;&lt;strong&gt;appender-ref&lt;/strong&gt;：0或者多个，允许记录方式引用其他记录方式，不被所有记录方式支持。&lt;br&gt;&lt;strong&gt;filter&lt;/strong&gt;：0或者多个，定义记录方式的过滤器&lt;br&gt;&lt;strong&gt;layout&lt;/strong&gt;：0个或者1个，定义记录方式的布局&lt;br&gt;&lt;strong&gt;param&lt;/strong&gt;：0或者多个，记录方式特定参数。 &lt;/p&gt;
&lt;p&gt;例子参见&lt;a href=&quot;http://logging.apache.org/log4net/release/config-examples.html&quot; target=&quot;_blank&quot;&gt;Example Appender Configuration&lt;/a&gt;文档
&lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#800000&quot;&gt;Filters（过滤器）&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;filter只可以定义为&amp;lt;appender&amp;gt;元素的子元素 
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;filter&amp;gt;节支持下列属性&lt;/font&gt;&lt;br&gt;&lt;strong&gt;type&lt;/strong&gt;：必须属性，值为过滤器的类型名称。如果过滤器不在log4net组件集中，必须给出完整的组件集名称。&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;filter&amp;gt;节支持下列子元素&lt;/font&gt;&lt;br&gt;&lt;strong&gt;param&lt;/strong&gt;：0或者多个，filter特定参数
&lt;p&gt;过滤器组成一个串来规定能够通过的事件，每个过滤器能够指定接受和处理的事件、拒绝和停止处理的事件或者允许事件到下一个过滤器。如果事件达到filter串的尽头而且没有被拒绝，那么它将被隐式的被记录器接受。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Filter.LevelRangeFilter&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;levelMin&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;INFO&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;levelMax&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;FATAL&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这个过滤器将会拒绝等级低于INFO或者高于FATAL的事件，其他事件包括INFO和FATAL将会被记录。&lt;br&gt;如果我们只想允许消息中包含特定字符（如“database”）的事件被记录，那么可以使用下面的过滤器&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Filter.StringMatchFilter&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;stringToMatch&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;database&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Filter.DenyAllFilter&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;上面的例子中，第一个过滤器将会检查时间消息中是否包含“database”，如果包含，过滤器将接受消息并停止过滤，事件被记录。如果不包含，事件被传递到下一个过滤器处理，如果没有下一个过滤器，时间会被隐式的记录。如果我们不想不符合过滤要求的事件被隐式记录，可以在最后加上log4net.Filter.DenyAllFilter，他将拒绝所有到达它的事件。
&lt;p&gt;如果我们希望记录消息中包含“database”或者“ldap”的事件，可以使用下列过滤器&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Filter.StringMatchFilter&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;stringToMatch&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;database&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Filter.StringMatchFilter&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;stringToMatch&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ldap&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Filter.DenyAllFilter&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h5&gt;&lt;font color=&quot;#800000&quot;&gt;Layouts&lt;/font&gt;&lt;/h5&gt;
&lt;p&gt;Layout只可以定义为&amp;lt;appender&amp;gt;元素的子元素 &lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;layout&amp;gt;节支持下列属性&lt;/font&gt;&lt;br&gt;&lt;strong&gt;type&lt;/strong&gt;：必须属性，值为layout的类型名称。如果过滤器不在log4net组件集中，必须给出完整的组件集名称。&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;layout&amp;gt;节支持下列子元素&lt;/font&gt;&lt;br&gt;&lt;strong&gt;param&lt;/strong&gt;：0或者多个，filter特定参数 
&lt;p&gt;下面的例子表示了怎样使用log4net.Layout.PatternLayout来配置布局。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger [%ndc] - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4&gt;&lt;strong&gt;&lt;u&gt;&lt;font color=&quot;#800000&quot;&gt;Root Logger（根记录器）&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt; &lt;/h4&gt;
&lt;p&gt;root logger只可以定义为&amp;lt;log4net&amp;gt;元素的子元素，它在记录器层次结构的根部，其他记录器都继承自他。 &lt;/p&gt;
&lt;p&gt;根记录器的例子&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;INFO&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;root&amp;gt;节不支持属性&lt;/font&gt;&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;root&amp;gt;节支持下列子元素&lt;br&gt;&lt;/font&gt;&lt;strong&gt;appender-ref&lt;/strong&gt;：0或者多个，允许记录器通过记录方式的名称引用记录方式&lt;br&gt;&lt;strong&gt;level&lt;/strong&gt;：0个或者1个，定义记录器的记录等级，记录器只记录大于或等于这一等级的事件&lt;br&gt;&lt;strong&gt;param&lt;/strong&gt;：0或者多个，记录器特定参数&lt;/p&gt;
&lt;h4&gt;&lt;u&gt;&lt;font color=&quot;#800000&quot;&gt;Loggers（记录器）&lt;/font&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p&gt;logger只可以定义为&amp;lt;log4net&amp;gt;元素的子元素&lt;br&gt;一个记录器的例子&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;LoggerName&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;DEBUG&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;logger&amp;gt;节支持下列属性&lt;/font&gt;&lt;br&gt;&lt;strong&gt;name&lt;/strong&gt;：必须属性，制定记录器的名称&lt;br&gt;&lt;strong&gt;additivity&lt;/strong&gt;：可选属性，值为true或者false，默认为true。指定为false时将禁止记录器继承父记录器的记录方式。&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;logger&amp;gt;节支持下列子元素&lt;/font&gt;&lt;br&gt;&lt;strong&gt;appender-ref&lt;/strong&gt;：0或者多个，允许记录器通过记录方式的名称引用记录方式&lt;br&gt;&lt;strong&gt;level&lt;/strong&gt;：0个或者1个，定义记录器的记录等级，记录器只记录大于或等于这一等级的事件&lt;br&gt;&lt;strong&gt;param&lt;/strong&gt;：0或者多个，记录器特定参数&lt;/p&gt;
&lt;h4&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;u&gt;Renderers（映射？）&lt;/u&gt;&lt;font color=&quot;#ff0000&quot;&gt;不太懂&lt;/font&gt;&lt;/font&gt;&lt;/h4&gt;
&lt;p&gt;Renderer只可以定义为&amp;lt;log4net&amp;gt;元素的子元素&lt;br&gt;一个renderer例子 &lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;renderer&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;renderingClass&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;MyClass.MyRenderer&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;renderedClass&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;MyClass.MyFunkyObject&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;renderer&amp;gt;节支持下列属性&lt;/font&gt;&lt;br&gt;&lt;strong&gt;renderingClass&lt;/strong&gt;：必须属性，值为该renderer的类型名称，如果类型不在log4net组件集中，必须给出完整的组件集名称。它是为被render的类型负责的类型&lt;br&gt;&lt;strong&gt;renderedClass&lt;/strong&gt;：必须属性，值为该renderer的目标类型名称，如果类型不在log4net组件集中。它是被render的的类型。
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;renderer&amp;gt;节支持子元素&lt;/font&gt;
&lt;h4&gt;&lt;u&gt;&lt;font color=&quot;#800000&quot;&gt;Parameters（参数）&lt;/font&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p&gt;parameter只可以定义为&amp;lt;log4net&amp;gt;元素的子元素&lt;br&gt;一个parameter例子 &lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConversionPattern&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger [%ndc] - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;param&amp;gt;节支持下列属性&lt;/font&gt;&lt;br&gt;&lt;strong&gt;name&lt;/strong&gt;：必须属性，值为传递到父对象中的parameter的名称&lt;br&gt;&lt;strong&gt;value&lt;/strong&gt;：可选属性，该属性的值是一个被转换成参数（parameter）的值的字符串。&lt;br&gt;&lt;strong&gt;type&lt;/strong&gt;：可选属性，该属性的值是一个用来创建和设置参数（parameter）的值的类型名称。如果类型不在log4net组件集中，必须给出完整的组件集名称。&lt;br&gt;value和type必须制定其中一个&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;&amp;lt;param&amp;gt;节支持下列子元素&lt;/font&gt;&lt;br&gt;&lt;strong&gt;param&lt;/strong&gt;：0或者多个，参数特定参数&lt;br&gt;一个使用嵌套参数元素的例子&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;evaluator&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.spi.LevelEvaluator&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Threshold&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;WARN&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h5&gt;&lt;strong&gt;&lt;font color=&quot;#800000&quot;&gt;扩展参数&lt;/font&gt;&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;配置参数直接映射对象的可写属性，可用的属性依赖于被配置对象的实际类型。log4net SDK文档包含了log4net组件集中所有部件的API参考。 &lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;strong&gt;紧凑参数语法&lt;/strong&gt;&lt;/font&gt;
&lt;h5&gt;&lt;/h5&gt;所有的参数可以使用参数名作为他们的元素名&lt;br&gt;例如 &lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;evaluator&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.spi.LevelEvaluator&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Threshold&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;WARN&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;可以写成&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;evaluator&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.spi.LevelEvaluator&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;threshold&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;WARN&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;evaluator&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2028648725934344230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2028648725934344230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2028648725934344230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2028648725934344230'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/log-for-log4net_28.html' title='Log For log4net (三) — 配置语法'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2119431120188751584</id><published>2007-04-27T21:16:00.001+08:00</published><updated>2007-04-27T21:24:59.448+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><title type='text'>Log For log4net (二) — 配置特性与配置文件</title><content type='html'>&lt;p&gt;接&lt;a href=&quot;http://sacranto.blogspot.com/2007/04/log-for-log4net.html&quot; target=&quot;_blank&quot;&gt;上篇&lt;/a&gt;&lt;/p&gt; &lt;p&gt;注：Attribute译为“特性”，Property译为“属性”&lt;/p&gt; &lt;p&gt;原文地址：&lt;a href=&quot;http://logging.apache.org/log4net/release/manual/configuration.html&quot;&gt;log4net Manual - Configuration&lt;/a&gt;  &lt;h3&gt;&lt;font color=&quot;#804040&quot;&gt;&lt;u&gt;配置特性&lt;/u&gt;&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;log4net除可以通过编程配置外还可以利用组件级别的特性进行配置&lt;/p&gt; &lt;h5&gt;&lt;font color=&quot;#804040&quot;&gt;XmlConfiguratorAttribute&lt;/font&gt;&lt;/h5&gt; &lt;p&gt;log4net.Config.XmlConfiguratorAttribute允许通过下列属性对XmlConfigurator进行配置。&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;configFile&lt;/font&gt;：指定对XmlConfigurator进使用的配置文件名，文件路径相对于程序的根文件夹(AppDomain.CurrentDomain.BaseDirectory)&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;ConfigFileExtension&lt;/font&gt;：指定配置文件的扩展名，组件集文件名加上指定的扩展名通常即配置文件名。例如从TestApp.exe中读取的组件制定ConfigFileExtension属性为log4net，则配置文件名为TestApp.exe.log4net。其效果与制定configFile属性为TestApp.exe.log4net相同。&lt;br&gt;&lt;/p&gt; &lt;p&gt;配置文件的路径为程序根文件夹(AppDomain.CurrentDomain.BaseDirectory)。&lt;/p&gt; &lt;p&gt;这个属性不能与configFile属性一起使用。&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#0000ff&quot;&gt;Watch&lt;/font&gt;：如果这个属性设为true，程序将会监视配置文件并在文件变化时重新载入配置。&lt;/p&gt; &lt;p&gt;如果configFile和ConfigFileExtension属性均没有指定，log4net将会使用应用程序配置文件（例如TestApp.exe.config） &lt;/p&gt; &lt;p&gt;示例用法&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// Configure log4net using the .config file&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; [assembly: log4net.Config.XmlConfigurator(Watch=&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;)]&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// This will cause log4net to look for a configuration file&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// called TestApp.exe.config in the application base&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// directory (i.e. the directory containing TestApp.exe)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; // The config file will be watched &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; changes.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// Configure log4net using the .log4net file&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension=&lt;span class=&quot;str&quot;&gt;&quot;log4net&quot;&lt;/span&gt;,Watch=&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;)]&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// This will cause log4net to look for a configuration file&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// called TestApp.exe.log4net in the application base&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// directory (i.e. the directory containing TestApp.exe)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; // The config file will be watched &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; changes.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;特性在一个组件集中只能使用一次 
&lt;p&gt;使用特性可以清晰的指定应用程序从何处加载配置文件，但特性是完全被动的，将不会起任何作用，他们只是一些信息。因此如果你使用了配置特性必须调用log4net允让它读取特性，简单的调用LogManager.GetLogger便可以使程序集中的特性能够被读取和处理。&lt;font color=&quot;#ff0000&quot;&gt;因此程序启动后尽早调用logging方法是必要的，而且必须在任何外部的组件集在读取和调用之前。&lt;/font&gt; 
&lt;h3&gt;&lt;u&gt;&lt;font color=&quot;#800000&quot;&gt;配置文件&lt;/font&gt;&lt;/u&gt;&lt;/h3&gt;
&lt;p&gt;典型的log4net配置是通过文件，文件可以通过两种方式读取&lt;br&gt;1. 使用.NET System.Configuration API&lt;br&gt;2. 直接读取内容&lt;/p&gt;
&lt;h5&gt;&lt;font color=&quot;#800000&quot;&gt;.config 文件&lt;/font&gt;&lt;/h5&gt;
&lt;p&gt;System.Configuration API只在配置数据在应用程序的config文件中时才起作用，如MyApp.exe.config或者Web.config.因为System.Configuration API不支持载入config文件中configuration外的标记时使用log4net.Config.XmlConfigurator.ConfigureAndWatch方法，使用System.Configuration API最大的有点在于它相比直接读取需要较低的权限。 &lt;/p&gt;
&lt;p&gt;使用System.Configuration API进行配置的唯一方法是调用log4net.Config.XmlConfigurator.Configure() 方法或者 the log4net.Config.XmlConfigurator.Configure(ILoggerRepository) 方法. 
&lt;p&gt;为了能够把配置数据嵌入到.config文件中，节的名字必须在configSections元素中注册到.NET解释器，还必须指定log4net.Config.Log4NetConfigurationSectionHandler用来解释这一配置节。其中类型必须是完整的组件集名因为它被.NET config文件解释器读取而不是log4net。必须指定正确的log4net组件集名。下面的配置文件示范了正确的方式&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;1.0&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt; ?&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configSections&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;section&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Config.Log4NetConfigurationSectionHandler, log4net&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configSections&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;                 &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger [%ndc] - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;INFO&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;上面的理智中，指定了log4net组件集，他必须位于.NET运行时能够找到的地方，例如与程序相同的文件夹。如果log4net组件集位于GAC中，完整的组件集名还包括文化、版本和公钥。 
&lt;p&gt;当用.config文件来配置时，节名即XML元素名必须为log4net。 
&lt;h5&gt;&lt;font color=&quot;#800000&quot;&gt;直接读取内容&lt;/font&gt;&lt;/h5&gt;
&lt;p&gt;XmlConfigurator能够直接读取XML文件并用它来配置log4net，包括.config文件如MyApp.exe.config或者Web.config。&lt;br&gt;不使用直接读取的唯一原因是应用程序的权限不能直接读取文件。因此必须使用NET configuration APIs &lt;/p&gt;
&lt;p&gt;包含配置数据的文件可以通过任何接受System.IO.FileInfo对象的log4net.Config.XmlConfigurator方法指定。因为文件系统能够用于监测并通知文件的变化，所以ConfigureAndWatch 方法被用于监测配置文件并在未见改变时重载它配置log4net。 
&lt;p&gt;此外，log4net.Config.XmlConfiguratorAttribute可以用于指定配置文件。 
&lt;p&gt;配置从文件中的log4net节读取，文件中只能有一个log4net元素但是它可以位于XML中的任意等级，例如根元素&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;1.0&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt; ?&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger [%ndc] - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;INFO&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;或者嵌入其他元素间。 
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;1.0&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt; ?&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configSections&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;section&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;System.Configuration.IgnoreSectionHandler&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configSections&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;                 &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger [%ndc] - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;INFO&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ConsoleAppender&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;上面的配置文件显示了怎么样把配置数据嵌入到.config文件中尽管文件能够被log4net直接读取。值得注意的是.NET config文件解释器如果发现没有在configSections元素注册的元素将会抛出一个异常。因此，上面的例子将log4net节注册，但是指定的处理类型为System.Configuration.IgnoreSectionHandler.这个内建的类表示已使用另外的方法来读取配置节。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2119431120188751584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2119431120188751584' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2119431120188751584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2119431120188751584'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/log-for-log4net_27.html' title='Log For log4net (二) — 配置特性与配置文件'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2443687657980455694</id><published>2007-04-27T12:58:00.001+08:00</published><updated>2007-04-27T21:26:13.167+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><title type='text'>Log For log4net (一) — 配置概述</title><content type='html'>&lt;p&gt;最近在写程序时，觉得对程序进行log很有必要。比如一个程序试运行时，可以通过log了解程序的运行情况等。.NET 框架下有&lt;a href=&quot;http://www.cnblogs.com/Terrylee/archive/2006/12/03/opensource_framework_and_resource_recommendation_Log.html&quot; target=&quot;_blank&quot;&gt;很多开源的log工具&lt;/a&gt;，log4net就是其中的代表。&lt;/p&gt; &lt;p&gt;以前学习英语的东西，都是只了解了一个大概。这次决定试试通过翻译英文文档来学习log4net，看看能不能有更多的收获。学习的过程就叫Log For log4net吧，好像有一点绕口:-)&lt;/p&gt; &lt;p&gt;第一部分选取了log4net手册的Configuration节。这一节比较长，打算分两次看完。&lt;/p&gt; &lt;p&gt;注：1. 代码中的英文注释将保留&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. log译为“记录”；logger译为“记录器”&lt;/p&gt; &lt;p&gt;原文地址：&lt;a href=&quot;http://logging.apache.org/log4net/release/manual/configuration.html&quot; target=&quot;_blank&quot;&gt;log4net Manual - Configuration&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;&lt;font color=&quot;#400040&quot;&gt;配置&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;对应用程序进行记录需要一定量的规划和工作。观察说明大约4成的代码是用来完成记录工作，即使中等规模的程序也需要在代码中嵌入上千行的记录语句。因此有必要自动维护记录代码。 &lt;/p&gt; &lt;p&gt;log4net环境是完全可程序化配置的，但是使用XML格式的配置文件对它进行配置将会更灵活方便。  &lt;p&gt;让我们看看是怎样在例子程序MyApp中使用log4net来完成记录。&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;译注：这里的MyApp为控制台应用程序。&lt;/font&gt;&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; Com.Foo;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// Import log4net classes.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; log4net;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; log4net.Config;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; MyApp &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt; {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;// Define a static logger variable so that it references the&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;// Logger instance named &quot;MyApp&quot;.&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;readonly&lt;/span&gt; ILog log = LogManager.GetLogger(&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(MyApp));&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args) &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// Set up a simple configuration that logs on the console.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;         BasicConfigurator.Configure();&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt;         log.Info(&lt;span class=&quot;str&quot;&gt;&quot;Entering application.&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:&lt;/span&gt;         Bar bar = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Bar();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:&lt;/span&gt;         bar.DoIt();&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:&lt;/span&gt;         log.Info(&lt;span class=&quot;str&quot;&gt;&quot;Exiting application.&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  22:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  23:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;MyApp首先声明导入log4net的相关类，然后定义了一个静态记录器变量，传入参数是该类的类名。 
&lt;p&gt;在MyApp中使用了下面的Bar类&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; log4net;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt; Com.Foo&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Bar&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;readonly&lt;/span&gt; ILog log = LogManager.GetLogger(&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(Bar));&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; DoIt()&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;             log.Debug(&lt;span class=&quot;str&quot;&gt;&quot;Did it again!&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;BasicConfigurator.Configure()方法创建了一个简单的log4net配置，这个方法增加了一个到控制台的根记录器，输入格式可以使用PatternLayout来设置，例如&quot;%-4timestamp [%thread] %-5level %logger %ndc - %message%newline&quot;. &lt;/p&gt;
&lt;p&gt;默认情况下，根记录器被分配到Level.DEBUG 
&lt;p&gt;上述代码的输出如下&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; 0    [main] INFO  MyApp  - Entering application.&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; 36   [main] DEBUG Com.Foo.Bar  - Did it again!&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; 51   [main] INFO  MyApp  - Exiting application.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;我们注意到在log4net中，子记录器只会连接到他们存在的上级。这里，名为Com.Foo.Bar的记录器直接连接到根记录器，因而将忽略未使用的Com或者Com.Foo的记录器。这种方法明显改进了性能和降低了log4net的内存使用。 &lt;/p&gt;
&lt;p&gt;MyApp类通过调用BasicConfigurator.Configure()方法来配置log4net，其他类只需要导入log4net命名空间，获取他们需要的记录器进行记录。 
&lt;p&gt;上面的例子总是输入相同的记录信息。当然，可以简单的修改MyApp使之在运行时刻控制记录。下面是一个轻微修改版本。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; Com.Foo;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;// Import log4net classes.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; log4net;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; log4net.Config;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; MyApp &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt; {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;readonly&lt;/span&gt; ILog log = LogManager.GetLogger(&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(MyApp));&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args) &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// BasicConfigurator replaced with XmlConfigurator.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;         XmlConfigurator.Configure(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; System.IO.FileInfo(args[0]));&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;         log.Info(&lt;span class=&quot;str&quot;&gt;&quot;Entering application.&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt;         Bar bar = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Bar();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt;         bar.DoIt();&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:&lt;/span&gt;         log.Info(&lt;span class=&quot;str&quot;&gt;&quot;Exiting application.&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这个版本的MyApp使用XmlConfigurator来解析配置文件和建立记录环境，配置文件的路径通过命令行制定。&lt;br&gt;&lt;font color=&quot;#0000ff&quot;&gt;译注：不知道怎么赋值给命令行参数，我是直接传递log4net的配置文件的名称。&lt;/font&gt; 
&lt;p&gt;下面是一个简单的配置文件，它的效果与上面的基于BasicConfigurator的例子完全相同。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- A1 is set to be a ConsoleAppender --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;A1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- A1 uses PatternLayout --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%-4timestamp [%thread] %-5level %logger %ndc - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;     &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- Set root logger level to DEBUG and its only appender to A1 --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;DEBUG&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;A1&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如果我们不再想记录任何Com.Foo命名空间中类的记录输出，可以参照下面的配置文件&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- A1 is set to be a ConsoleAppender --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;A1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- A1 uses PatternLayout --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;             &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- Print the date in ISO 8601 format --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%date [%thread] %-5level %logger %ndc - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;     &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- Set root logger level to DEBUG and its only appender to A1 --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;DEBUG&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;A1&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt;     &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- Print only messages of level WARN or above in the package Com.Foo --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Com.Foo&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;WARN&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  22:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;输出将会是这样：&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; 2000-09-07 14:07:41,508 [main] INFO  MyApp - Entering application.&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; 2000-09-07 14:07:41,529 [main] INFO  MyApp - Exiting application.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;因为记录器Com.Foo.Bar没有分配级别，它将继承配置文件中已分配为Warn级别的Com.Foo的级别，Bar.DoIt方法中记录语句的级别为DEBUG，低于WARN，因此DoIt方法的记录请求将被禁止。 &lt;/p&gt;
&lt;p&gt;下面是使用多记录方式的配置文件&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Console&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.ConsoleAppender&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;             &lt;span class=&quot;rem&quot;&gt;&amp;lt;!-- Pattern to output the caller&#39;s file name and line number --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%5level [%thread] (%file:%line) - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;RollingFile&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Appender.RollingFileAppender&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;example.log&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appendToFile&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;maximumFileSize&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;100KB&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;maxSizeRollBackups&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;2&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;conversionPattern&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;%level %thread %logger - %message%newline&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:&lt;/span&gt;     &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;level&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;DEBUG&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  22:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Console&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  23:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;appender-ref&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;RollingFile&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  24:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  25:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;log4net&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;运行它控制台将会出现如下输出&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; INFO [main] (MyApp.cs:16) - Entering application.&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; EBUG [main] (Bar.cs:12) - Doing it again!&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; INFO [main] (MyApp.cs:19) - Exiting application.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;指的注意的是，因为根记录器有第二个记录方式，记录也会被输出到example.log文件，文件将会被回滚当他达到100KB，当回滚发生时，旧版本的example.log将会被重命名为example.log.1 
&lt;p&gt;注意，实现这些不同的记录行为并不需要重新编译程序。我们可以轻松的将记录输出到Email地址、Windows的事件记录器，或者远程的log4net服务器。 
&lt;p&gt;更多的使用XmlConfigurator实现多输出方式的例子 &lt;a href=&quot;http://logging.apache.org/log4net/release/config-examples.html&quot; target=&quot;_blank&quot;&gt;点击这里&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2443687657980455694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2443687657980455694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2443687657980455694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2443687657980455694'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/log-for-log4net.html' title='Log For log4net (一) — 配置概述'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-1998979711068586441</id><published>2007-04-24T22:33:00.001+08:00</published><updated>2007-04-24T22:36:42.308+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Excel中的日期</title><content type='html'>&lt;p&gt;今天使用&lt;a href=&quot;http://sourceforge.net/projects/koogra/&quot; target=&quot;_blank&quot;&gt;koogra库&lt;/a&gt;读取Excel数据时才知到原来Excel中的日期都是用数值表示的，并且在文件中也是使用数值存储，从而在程序读出来的是这个表示日期的数值。起始日期是1900-1-1 0:00:00 ，它对应数值1。1900-1-2 0:00:00 则对应数值2，也就是说表示日期的数值单位是天。&lt;/p&gt; &lt;p&gt;如果要根据读取对应的日期，使用下述语句便可以简单的完成。记得要把表示日期的数值－１，&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; Convert.ToDateTime(&lt;span class=&quot;str&quot;&gt;&quot;1900-01-01 0:0:0&quot;&lt;/span&gt;).AddDays(date - 1)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;然后，由于Excel为了保持与 Lotus-123 的兼容性，保留了Lotus-123 把1900年算成闰年的Bug（实际上不是），所以1900-2-29也同样占用了一个数值60，因此1900-3-1 0:00:00 对应的数值变成了61。但是在.NET中是没有这个bug，因此用上述代码返回日期时，60则返回1900-3-1 0:00:00 。为了兼容这个问题，需要把表示日期的数值再减去1才能得到正确的结果。正确代码如下，数值60和61都表示日期1900-3-1 0:00:00 &lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt;(date&amp;lt;=60){&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; Convert.ToDateTime(&lt;span class=&quot;str&quot;&gt;&quot;1900-01-01 0:0:0&quot;&lt;/span&gt;).AddDays(date - 1);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;{&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; Convert.ToDateTime(&lt;span class=&quot;str&quot;&gt;&quot;1900-01-01 0:0:0&quot;&lt;/span&gt;).AddDays(date - 2);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/1998979711068586441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/1998979711068586441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/1998979711068586441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/1998979711068586441'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/excel.html' title='Excel中的日期'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2364732791075643962</id><published>2007-04-22T22:38:00.001+08:00</published><updated>2007-04-23T10:56:52.226+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><title type='text'>使用Javascript 调用.NET WEB服务</title><content type='html'>&lt;p&gt;过去使用Javascript调用服务器端代码时，后台代码一直都是放在普通的ASPX页面的Page_Load方法内，一直觉得这种方式不是很好，每实现一个功能都要一个新的页面来实现，也许还有其他问题。如果能够使用WEB服务的话，就可以解决上述问题，如可以在一个Web服务页面内放置多个函数和代码，解决web服务调用验证等。&lt;/p&gt; &lt;p&gt;在网上搜索Javascript调用web服务的方法，找到一篇&lt;a href=&quot;http://www.ibm.com/developerworks/cn/webservices/ws-wsajax/&quot; target=&quot;_blank&quot;&gt;使用 Ajax 调用 SOAP Web 服务&lt;/a&gt;，但总是感觉好像太复杂了，要使用到它的Web Services JavaScript Library。另外一种我知道的方法就是使用ASP.NET Ajax，使用这个库调用web服务很简单并且实现的功能也很强。但是如果不使用这么重量的库能不能直接使用Javascript调用WEB服务呢？&lt;/p&gt; &lt;p&gt;一个偶然的机会，我发现使用ASP.NET编写的Web服务格式是这样的。加入名为Demo的asmx页面中有一个Web方法为foo()。那么调用它的时候，在地址栏显示的地址是Demo.asmx/foo。那么在Javascript能不能直接post（get）到服务器的这个页面呢？答案是可以，从而这样很简单的就实现了通过Javascript 调用WEB服务，也不需要其他库的支持。&lt;/p&gt; &lt;p&gt;下面用一个例子简单实现Javascript 调用WEB服务，假设WEB应用程序的Services/Demo.asmx中存在foo方法返回&quot;Hello World&quot;。&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; [WebMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; foo()&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;直接通过Services/Demo.asmx/foo访问，得到下面结果，是一个XML文件&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;1.0&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt; ?&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://sacranto.blogspot.com/&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;Hello World&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;在Javascript中的调用如下：（Javascript中使用了&lt;a href=&quot;http://jquery.org&quot; target=&quot;_blank&quot;&gt;jQuery&lt;/a&gt;库，这个库与是否调用WEB服务没有关系，下同）&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; $(document).ready(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     $(&lt;span class=&quot;str&quot;&gt;&quot;#btnFoo&quot;&lt;/span&gt;).click(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;(){&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;         $.post(&lt;span class=&quot;str&quot;&gt;&quot;Services/Demo.asmx/foo&quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;(res){&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;                 alert($(res).text());&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;         );&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     });&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt; });&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这段代码用于显示返回xml中的字符，IE7和FF2的结果不同，个人认为FF2的好一些。不知道IE6和其他浏览器的结果怎么样？&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;1&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/468348888/&quot;&gt;&lt;img alt=&quot;1&quot; src=&quot;http://static.flickr.com/199/468348888_eac605f477.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a title=&quot;2&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/468360657/&quot;&gt;&lt;img alt=&quot;2&quot; src=&quot;http://static.flickr.com/171/468360657_101eb9cbcf.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;那么能不能直接传递参数给WEB服务呢？在ASP.NET WEB服务中，答案仍然是可以（使用其他语言编写的WEB服务应该也可以吧）。借助于WebService.Context 获取当前请求的ASP.NET HttpContext，它封装了由 HTTP 服务器用来处理Web 请求的所有HTTP 特定的上下文。&lt;/p&gt;
&lt;p&gt;修改请求的Javascript代码，多了传递参数的一行。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; $(document).ready(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     $(&lt;span class=&quot;str&quot;&gt;&quot;#btnFoo&quot;&lt;/span&gt;).click(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;(){&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;         $.post(&lt;span class=&quot;str&quot;&gt;&quot;Services/Demo.asmx/foo&quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         &lt;font color=&quot;#ff0000&quot;&gt;    {name:&lt;span class=&quot;str&quot;&gt;&#39;sacranto&#39;&lt;/span&gt;,age:&#39;24&#39;},&lt;/font&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;(res){&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;                 alert($(res).text());&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;         );&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     });&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt; });&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这样在web服务页面中，可以通过如下代码访问传递的参数&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; name = Context.Request.Form[&lt;span class=&quot;str&quot;&gt;&quot;name&quot;&lt;/span&gt;];&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; age = Convert.ToInt32(Context.Request.Form[&lt;span class=&quot;str&quot;&gt;&quot;age&quot;&lt;/span&gt;]);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;解决了传递参数的问题，救下来就是返回值了。web服务直接返回的都是xml，我们也可以利用Respone返回其他格式，如text/plain。例如线面的fooText方法就返回了纯文本，记得把方法改成无返回值。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; [WebMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; fooText()&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; name = Context.Request.Form[&lt;span class=&quot;str&quot;&gt;&quot;name&quot;&lt;/span&gt;];&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; age = Convert.ToInt32(Context.Request.Form[&lt;span class=&quot;str&quot;&gt;&quot;age&quot;&lt;/span&gt;]);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     Context.Response.Expires = -1;       &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     Context.Response.ContentType = &lt;span class=&quot;str&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     Context.Response.Write(&lt;span class=&quot;str&quot;&gt;&quot;Hello &quot;&lt;/span&gt; + name + &lt;span class=&quot;str&quot;&gt;&quot;, your age is &quot;&lt;/span&gt; + age.ToString());&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     Context.Response.End();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;在Javascript中的调用与上面基本相同，只是回调类型是text，直接使用即可。这也意味着text可以直接是json字符串了。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; $(&lt;span class=&quot;str&quot;&gt;&quot;#btnFooText&quot;&lt;/span&gt;).click(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;(){&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     $.post(&lt;span class=&quot;str&quot;&gt;&quot;Services/Demo.asmx/fooText&quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;         {name:&lt;span class=&quot;str&quot;&gt;&#39;sacranto&#39;&lt;/span&gt;,age:&lt;span class=&quot;str&quot;&gt;&#39;24&#39;&lt;/span&gt;},&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;(res){&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;             &lt;font color=&quot;#ff0000&quot;&gt;alert(res);&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     );&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt; });&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;看看结果&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;3&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/468379082/&quot;&gt;&lt;img alt=&quot;3&quot; src=&quot;http://static.flickr.com/224/468379082_3ae32cb2d2.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用Javascript 调用.NET WEB服务，是不是很简单呢?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PS：据说这种方法使用 http://localhost/... 访问就正常, 但用域名会出错。　我试了用IP是没有问题的，用域名？我还没有域名呢 :-)&lt;/p&gt;
&lt;p&gt;解决方法：&lt;br&gt;在Web.config里面加上就可以了.&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &amp;lt;webServices&amp;gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     &amp;lt;protocols&amp;gt; &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;         &amp;lt;add name=&lt;span class=&quot;str&quot;&gt;&quot;HttpPost&quot;&lt;/span&gt; /&amp;gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         &amp;lt;add name=&lt;span class=&quot;str&quot;&gt;&quot;HttpGet&quot;&lt;/span&gt; /&amp;gt; &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &amp;lt;/protocols&amp;gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; &amp;lt;/webServices&amp;gt; &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2364732791075643962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2364732791075643962' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2364732791075643962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2364732791075643962'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/javascript-net-web.html' title='使用Javascript 调用.NET WEB服务'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2472846611775717668</id><published>2007-04-21T11:20:00.001+08:00</published><updated>2007-04-21T11:27:04.154+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><title type='text'>Javascript 的命名空间、类、属性和方法</title><content type='html'>&lt;p&gt;今天在网上看了一些实现Javascript 的命名空间、类、属性和方法的文章，下面是我自己尝试的代码，由于对Javascript这种prototype型的语言的理解不是很深，理解可能有误，还好实现应该没有问题的:-)&lt;/p&gt; &lt;p&gt;一. 命名空间：分为两个部分。第一个部分是注册函数，另外一部分是声明命名空间&lt;/p&gt; &lt;p&gt;命名空间注册函数，参照&lt;a href=&quot;http://developer.yahoo.com/yui/&quot; target=&quot;_blank&quot;&gt;yui&lt;/a&gt;的方式，注意这种方式下所有的命名空间的第一级都是sacranto。&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; var sacranto = {};&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; sacranto.&lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt;=function(ns){&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt;(!ns||!ns.length){&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     var levels = ns.split(&lt;span class=&quot;str&quot;&gt;&quot;.&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     var nsobj=sacranto;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt;(var i=(levels[0] == &lt;span class=&quot;str&quot;&gt;&quot;sacranto&quot;&lt;/span&gt;)?1:0;i&amp;lt;levels.length;i++){&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;         nsobj[levels[i]]=nsobj[levels[i]]||{};&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;         nsobj = nsobj[levels[i]];&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;     &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; nsobj;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt; };    &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;声明命名空间的语句，这样我们就注册了一个sacranto.demo命名空间。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; sacranto.&lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt;(&lt;span class=&quot;str&quot;&gt;&quot;demo&quot;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;二. 类：对于prototype类型的语言，函数其实就是类，声明一个函数其实就声明了一个类，并且他还是是类的静态构造函数。下面的语句声明了一个类，静态构造函数里面什么也没有做。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; sacranto.demo.aclass = function(){};&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;三. 类的属性和方法：这里就需要使用到prototype这个特性了&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; sacranto.demo.aclass.prototype = {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;//属性&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     version: &lt;span class=&quot;str&quot;&gt;&quot;1.0&quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;//方法&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     bar: function(s){&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;hello &quot;&lt;/span&gt; + s;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt; };&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;四. 静态方法：仿佛在javascript里面应该没有静态方法这个概念吧。我的理解是这样的&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;rem&quot;&gt;//我理解的静态方法，其实是另外一个类和它的静态构造函数。&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; sacranto.demo.aclass.foo=function(s){&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;hello &quot;&lt;/span&gt;+s;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;OK，完成，测试一下吧&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; window.onload = function(){&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     var aobj=&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; sacranto.demo.aclass();&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     alert(aobj.bar(&lt;span class=&quot;str&quot;&gt;&quot;world&quot;&lt;/span&gt;));                    &lt;span class=&quot;rem&quot;&gt;//成功&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;//alert(sacranto.demo.aclass.bar(&quot;world&quot;));    //失败&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     alert(sacranto.demo.aclass.foo(&lt;span class=&quot;str&quot;&gt;&quot;world&quot;&lt;/span&gt;));    &lt;span class=&quot;rem&quot;&gt;//成功&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; };&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;延伸阅读：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.crockford.com/javascript/private.html&quot; target=&quot;_blank&quot;&gt;Private Members in JavaScript&lt;/a&gt;　英文：讨论了类中的私有成员&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dev.csdn.net/article/84/84222.shtm&quot; target=&quot;_blank&quot;&gt;prototype的一个优势也是缺点&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 中文：prototype实现类的属性和方法，以及在运行时刻会改变的特点。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PS：取消 使用IE打开包括JavaScript 的本地web页时收到安全警告 方法&lt;/p&gt;
&lt;p&gt;1. 在 工具 菜单上, 单击 Internet选项&lt;br&gt;2. 单击 高级 选项卡&lt;br&gt;3. 在 设置 列表, 确定依次选中 安全--允许活动内容在本机上的文件中运行。此选项允许您运行脚本和 ActiveX 控件在 InternetExplorer 中&lt;br&gt;4. 在 文件 菜单上, 单击 关闭&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2472846611775717668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2472846611775717668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2472846611775717668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2472846611775717668'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/javascript.html' title='Javascript 的命名空间、类、属性和方法'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-1981360939846226681</id><published>2007-04-18T23:02:00.001+08:00</published><updated>2007-04-19T10:04:22.604+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Database"/><title type='text'>配置iBatis.NET DataMapper</title><content type='html'>&lt;p&gt;一.　在&lt;a href=&quot;http://ibatis.apache.org/dotnetdownloads.cgi&quot; target=&quot;_blank&quot;&gt;iBatis.Net的官方网站&lt;/a&gt;下载iBatis.NET DataMapper 1.6.1。这个是今年4月6号的最新版本，也是快一年以来的第一次更新。&lt;/p&gt; &lt;p&gt;下载的Release的版本解压缩以后看起来很杂乱，dll、xml和xsd等一大堆。&lt;/p&gt; &lt;p&gt;二.　为了能够在Visual中编写映射文件和配置文件时使用智能提示和校验，首先把provider.xsd、SqlMap.xsd和SqlMapConfig.xsd拷贝到&lt;code&gt;[VS安装目录]\Xml\Schemas，这个路径是相对于VS 2005的，其他版本参看文档4.2.4节。&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;注：iBatis.NET的文档是需要单独下载的，不在Release包里面，下面提到的文档均是1.6.1版本的文档。&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;三. 使用iBatis.NET之前需要在VS的工程中添加对IBatisNet.DataMapper.dll引用，添加它的同时，它会自动将IBatisNet.Common.dll和Castle.DynamicProxy.dll添加到工程的bin目录下。&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;四. 编写SqlMap.config文件，并将其置于跟目录下,一般是Web.config(WEB应用程序)或者App.config(winform)所在的文件夹。下面是一个简单示例，修改自iBatis.NET文档。&lt;/code&gt;&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &amp;lt;?xml version=&lt;span class=&quot;str&quot;&gt;&quot;1.0&quot;&lt;/span&gt; encoding=&lt;span class=&quot;str&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;?&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &amp;lt;sqlMapConfig xmlns=&lt;span class=&quot;str&quot;&gt;&quot;http://ibatis.apache.org/dataMapper&quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; xmlns:xsi=&lt;span class=&quot;str&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;/span&gt; &amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;   &amp;lt;properties resource=&lt;span class=&quot;str&quot;&gt;&quot;properties.config&quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;   &amp;lt;settings&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     &amp;lt;setting useStatementNamespaces=&lt;span class=&quot;str&quot;&gt;&quot;true&quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     &amp;lt;setting cacheModelsEnabled=&lt;span class=&quot;str&quot;&gt;&quot;true&quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     &amp;lt;setting validateSqlMap=&lt;span class=&quot;str&quot;&gt;&quot;false&quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;   &amp;lt;/settings&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;   &amp;lt;database&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;     &amp;lt;provider name=&lt;span class=&quot;str&quot;&gt;&quot;sqlServer2.0&quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;     &amp;lt;dataSource name=&lt;span class=&quot;str&quot;&gt;&quot;iBatisExt&quot;&lt;/span&gt;  connectionString=&lt;span class=&quot;str&quot;&gt;&quot;user id=sa;password=sa;data source=10.14.91.244;database=northwind;&quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;   &amp;lt;/database&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;   &amp;lt;sqlMaps&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt;     &amp;lt;sqlMap resource=&lt;span class=&quot;str&quot;&gt;&quot;${root}Maps/Categories.xml&quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt;   &amp;lt;/sqlMaps&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:&lt;/span&gt; &amp;lt;/sqlMapConfig&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;其中首先指定Properties文件的位置，此处的Properties.config与SqlMap.config位于相同位置，Properties文件一般用来定义“名称-值”对，例如下面使用到的${root}就是在Properties.config中定义的，这里使用的Properties文件如下，很简单：&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &amp;lt;?xml version=&lt;span class=&quot;str&quot;&gt;&quot;1.0&quot;&lt;/span&gt; encoding=&lt;span class=&quot;str&quot;&gt;&quot;utf-8&quot;&lt;/span&gt; ?&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &amp;lt;settings&amp;gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;   &amp;lt;add key=&lt;span class=&quot;str&quot;&gt;&quot;root&quot;&lt;/span&gt; value=&lt;span class=&quot;str&quot;&gt;&quot;./&quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &amp;lt;/settings&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Setting用于给定ibatis.net的一些属性，例如useStatementNamespaces是是否允许使用map文件中的命名空间，文档中的示例为false，注意把它改成true，因为下面的程序使用了map文件中的命名空间。&lt;/p&gt;
&lt;p&gt;database用于配置映射的数据源，Provider我改成了sqlServer2.0。&lt;/p&gt;
&lt;p&gt;五. 把定义数据源的providers.config拷贝到与SqlMap.config相同的目录下，打开providers.config，修改其中的&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &amp;lt;provider&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     name=&lt;span class=&quot;str&quot;&gt;&quot;sqlServer2.0&quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     enabled=&lt;span class=&quot;str&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;为&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &amp;lt;provider&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     name=&lt;span class=&quot;str&quot;&gt;&quot;sqlServer2.0&quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     enabled=&lt;span class=&quot;str&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这里默认情况下，也就是从Release文件夹拷贝过来的providers.config是不打开sqlServer2.0，这个地方害我修改了半天。&lt;/p&gt;
&lt;p&gt;六.&amp;nbsp; 编写映射文件、实体类就完成了iBatis的配置。如果你不想自己编写映射文件、实体类，Go on&lt;/p&gt;
&lt;p&gt;七.&amp;nbsp; 我找到了一个iBatis.NET的CodeSmith模板，名字叫做&lt;a href=&quot;http://www.cnblogs.com/smartkid/archive/2007/02/22/653828.html&quot; target=&quot;_blank&quot;&gt;IBatisNetGen&lt;/a&gt;，个人觉得很好用，它直接生成了映射文件、实体类、DAO接口和DAO层。注意在使用时制定他们的命名空间，免得生成后自己去修改。&lt;/p&gt;
&lt;p&gt;八.&amp;nbsp; 使用上述模板注意有一个地方需要修改，就是在把DAO模板里面需要把SqlMapperFmt属性改为你自己的Mapper类，如本文中使用iBatis.NET默认的Mapper.Instance()。&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;1&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/464624382/&quot;&gt;&lt;img alt=&quot;1&quot; src=&quot;http://static.flickr.com/202/464624382_a4afd4fc8d.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果使用到了多数据库，要用不同的SqlMap文件，并编写不同的Mapper类，如这里完成了一个使用AnotherSqlMap.config文件的AnotherSqlMapper类（参考文档Example 4.4），注意红色的行与iBatis.net中文档4.4.1.1节有一点区别，4.4.1.1节的语句不能直接用于替换文档中的Example 4.4的对应语句，必须做红色标示的修改。奇怪一下文档为什么不前后一致呢？&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; IBatisNet.Common.Utilities;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; IBatisNet.DataMapper;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; IBatisNet.DataMapper.Configuration;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt; Demo&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt; {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; AnotherSqlMapper&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;volatile&lt;/span&gt; ISqlMapper _mapper = &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Configure(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; obj)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;             _mapper = &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; InitMapper()&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt;             ConfigureHandler handler = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ConfigureHandler(Configure);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:&lt;/span&gt;             DomSqlMapBuilder builder = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DomSqlMapBuilder();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:&lt;/span&gt;             &lt;font color=&quot;#ff0000&quot;&gt;_mapper = builder.ConfigureAndWatch(&lt;span class=&quot;str&quot;&gt;&quot;AnotherSqlMap.config&quot;&lt;/span&gt;,handler);&lt;/font&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  22:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  23:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; ISqlMapper Instance()&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  24:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  25:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (_mapper == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  26:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  27:&lt;/span&gt;                 &lt;span class=&quot;kwrd&quot;&gt;lock&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(SqlMapper))&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  28:&lt;/span&gt;                 {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  29:&lt;/span&gt;                     &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (_mapper == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  30:&lt;/span&gt;                     {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  31:&lt;/span&gt;                         InitMapper();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  32:&lt;/span&gt;                     }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  33:&lt;/span&gt;                 }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  34:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  35:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; _mapper;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  36:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  37:&lt;/span&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  38:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; ISqlMapper Get()&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  39:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  40:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; Instance();&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  41:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  42:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  43:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;九&amp;nbsp;配置完成，以Northwind中的Categories表为例，实体类Categories。C#获取全部记录的调用语句。&lt;/p&gt;
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; ICategoriesDao catDao=&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; CategoriesDao();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;         IList&amp;lt;Categories&amp;gt; cats = catDao.FindAll();&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;         gvCategories.DataSource = cats;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;         gvCategories.DataBind();&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/1981360939846226681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/1981360939846226681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/1981360939846226681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/1981360939846226681'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/04/ibatisnet-datamapper.html' title='配置iBatis.NET DataMapper'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2809585416012333478</id><published>2007-03-30T16:22:00.001+08:00</published><updated>2007-04-04T09:20:26.067+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Subversion 服务器的建立</title><content type='html'>&lt;p&gt;作为一个非专业的程序设计人员，原来编程序要进行版本控制总是使用winrar压缩，今天尝试了一下Subversion（SVN），感觉的确很好用，以后就用它代替rar了。不知道用来对word文档或者其他的进行控制行不行。使用SVN首先要建立SVN服务器。这方面教程网上很多，写这篇blog的目的是帮助自己记录，免得以后到处找资料，如果对你有一点用就更好了。Subversion有一本很好的图书教程 &lt;a href=&quot;http://svnbook.subversion.org.cn/1.1/index.html&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;使用Subversion进行版本控制&lt;/em&gt;&lt;/a&gt;&amp;nbsp; 免费PDF或者HTML，多语言版本，内容齐全，同时意味着复杂，这也是写这篇blog的原因。&lt;/p&gt; &lt;p&gt;这篇blog的目的是 &lt;font color=&quot;#0000ff&quot;&gt;照着它操作即可以配置出局域网内可以直接使用的Subversion服务器&lt;/font&gt; 。&lt;/p&gt; &lt;p&gt;1. 下载Subversion服务器，地址&lt;a href=&quot;http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91&quot; target=&quot;_blank&quot;&gt;http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91&lt;/a&gt;　选择setup.exe结尾的安装版本，如果你喜欢非安装版本也可以，自己配置环境变量的路径就可以了。&lt;/p&gt; &lt;p&gt;2. 安装Subversion 客户端TortoiseSVN，地址&lt;a title=&quot;http://tortoisesvn.net/downloads&quot; href=&quot;http://tortoisesvn.net/downloads&quot; target=&quot;_blank&quot;&gt;http://tortoisesvn.net/downloads&lt;/a&gt;，同样选择安装版本，有需要可以同时下载语言包。客户端不是必须的，但是使用它可以在图形化界面下进行操作。TortoiseSVN是比较流行的Windows下的客户端。安装后没有自己的界面，而是直接集成在资源管理器（右键菜单）里面。&lt;/p&gt; &lt;p&gt;3. 建立版本库（Repository），既存放文件的地方。使用TortoiseSVN到欲建立版本库的目录如E:\svn\repository右击，TortoiseSVN——在此创建版本库。选择本地文件系统。另外一种BDB方式没用过。&lt;/p&gt; &lt;p&gt;4. 启动Subversion服务器。这里我们直接使用Subversion服务器，其他参看图书教程。启动服务器有两种方式&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a. 命令行输入 &lt;font color=&quot;#0000ff&quot;&gt;svnserve -d -r E:\svn\repository&lt;/font&gt; 启动服务。这个是临时方法，即命令行窗口在使用过程中不能关闭，关闭服务器就停止了。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b. 把subversion当作windows的服务。命令行输入 &lt;font color=&quot;#0000ff&quot;&gt;sc create svnservice binpath= &quot;\&quot;e:\program files\Subversion\bin\svnserve.exe\&quot; --service -r E:\svn\repository&quot; displayname= &quot;SVNService&quot; depend= Tcpip &lt;/font&gt;&lt;font color=&quot;#400040&quot;&gt;。binbinpath指向svnserve.exe所在目录。后面一个指向刚刚建立的版本库。注意语句里面的空格不要随意增减减少，否则会出错。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#400040&quot;&gt;5. 导入工程。选择工程的根文件夹，右击--TortoiseSVN——导入。版本库URL填写Subversion所在服务器IP及欲建立工程目录如svn://10.14.91.244/PISDKDemoProject，导入信息中输入对项目的描述，如图&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a title=&quot;1&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/439536417/&quot;&gt;&lt;img height=&quot;293&quot; alt=&quot;1&quot; src=&quot;http://static.flickr.com/181/439536417_7d26f554da.jpg&quot; width=&quot;400&quot; align=&quot;center&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;这一步同样可以在装有TortoiseSVN的客户端上面进行操作。&lt;/p&gt; &lt;p&gt;６&amp;nbsp; 浏览服务器&lt;/p&gt; &lt;p&gt;右键——TortoiseSVN——版本库浏览器，输入服务器地址svn://10.14.91.244，便可看到服务器上面项目&lt;/p&gt; &lt;p&gt;&lt;a title=&quot;2&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/439540778/&quot;&gt;&lt;img height=&quot;310&quot; alt=&quot;2&quot; src=&quot;http://static.flickr.com/172/439540778_01fb23b4b0.jpg&quot; width=&quot;409&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;7 签出程序，找到欲下载程序的目录。&lt;/p&gt; &lt;p&gt;右键——SVN检出，紧接着输入服务器URL和路径如svn://10.14.91.244/PISDKDemoProject。&lt;/p&gt; &lt;p&gt;这样便可以看见目录图标上面有一个小勾。便表示目录已经和服务器绑定了，从而实习下载或者提交等操作。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2809585416012333478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2809585416012333478' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2809585416012333478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2809585416012333478'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/subversion.html' title='Subversion 服务器的建立'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-8937389663675698594</id><published>2007-03-29T21:14:00.001+08:00</published><updated>2007-03-29T21:42:15.987+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Database"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>利用PI-SDK读取和写入snapshot或者archive的示例</title><content type='html'>&lt;p&gt;一个很简单的程序。实现PI-SDK读取和写入snapshot或者archive。以测试读取和写入int和float的数据，bool和string类型没有测试，估计需要修改，但是原理是一样的。界面如图，从上到下，从左到右操作就可以了。&lt;/p&gt; &lt;p&gt;&lt;a title=&quot;sdkdemo&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/438625776/&quot;&gt;&lt;img alt=&quot;sdkdemo&quot; src=&quot;http://static.flickr.com/160/438625776_57ab517603.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;很简单的版权说明，呵呵&lt;/p&gt; &lt;p&gt;×××××××××××××××××××××××××××××××××××××××××××××&lt;/p&gt; &lt;p&gt;利用PI-SDK读取和写入snapshot或者archive的示例 &lt;/p&gt; &lt;p&gt;(c) 皮生 (&lt;a href=&quot;http://sacranto.blogspot.com)&quot;&gt;http://sacranto.blogspot.com)&lt;/a&gt; 2007  &lt;p&gt;最后更新 - 3/29/2007 20:55  &lt;p&gt;These code are provided AS IS. You can copy it, use it, and distribute it as long as this statement are not removed.  &lt;p&gt;×××××××××××××××××××××××××××××××××××××××××××××  &lt;p&gt;&amp;nbsp;  &lt;p&gt;下载地址：&lt;a href=&quot;http://www.box.net/shared/4oho1qjarq&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;&amp;nbsp;或者右边共享文件里面的PISDKDemo.rar&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/8937389663675698594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/8937389663675698594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/8937389663675698594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/8937389663675698594'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/pi-sdksnapshotarchive.html' title='利用PI-SDK读取和写入snapshot或者archive的示例'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-1291251686909392488</id><published>2007-03-29T20:52:00.001+08:00</published><updated>2007-03-29T21:41:37.228+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Database"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>PI-SDK错误-2147220424的解决方法</title><content type='html'>&lt;p&gt;最近有不少人通过IM问我关于PI-SDK开发的问题，正好我也好久没有看了，把原来学习的时候写的一个利用PI-SDK读取snapshot和archive的例子拿出来重温了一下。调试运行结果竟然不通过，记得原来这个例子是OK的，看了以下错误出在Server对象的Open方法上，这个方法是用于连接数据库的。仔细看了SDK的文档，连接字符串的写法、用户名和密码均正确，但是就是连不上，每运行到这里就跑出异常-2147220424。异常提示“ServerID returned from server does not match that currently configured on this machine. The server at the path for the opened handle may have changed. ”我理解的大意是服务器的句柄变化，返回的ServerID和机器的当前配置不同。记起前几天把实验用的PI数据库重装过，难道是这个原因不成。但是怎么解决呢？文档和Google均没有找到好的答案。&lt;/p&gt; &lt;p&gt;首先，利用PI-API连接数据库，在权限允许的情况下，读写均没有问题，虽然PI-API和PI-SDK使用两套不同的登录方式，但是这样至少说明我的机器和数据库的连接是没有问题的。&lt;/p&gt; &lt;p&gt;接着，按照&lt;em&gt;Troubleshooting PI client connection problems&lt;/em&gt;上的方法使用AboutPI-SDK对话框测试登录，结果仍然可以。但是回到程序就是不行。&lt;/p&gt; &lt;p&gt;最后，另外写了一个程序重新连接数据库，仍然报相同的错误，可能是因为Com组件的信息是保存在注册表，登录时仍然使用了以前保存的信息。既然猜想登录信息保存在注册表，那么直接去注册表中更改一下信息不是就好了，可惜不知道改哪里。&lt;/p&gt; &lt;p&gt;正在这是灵光一现，想着干嘛这么复杂。直接利用AboutPI-SDK对话框新建一个连接，再把原来的那个连接给删掉不是应该就可以删除注册表中的原来连接信息了吗？搞定。这个时候相同的程序，open方法使用相同的语句登录上了数据库。&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;估计这个是一个SDK的小BUG，如果以前连接过PI数据库、在PI数据库重装以后，必须更新本机的SDK在注册表中信息，更新方法很简单。使用AboutPI-SDK对话框新建一个连接，再把原来的那个连接给删掉。&lt;/font&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/1291251686909392488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/1291251686909392488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/1291251686909392488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/1291251686909392488'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/pi-sdk-2147220424.html' title='PI-SDK错误-2147220424的解决方法'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-6657996398287252233</id><published>2007-03-29T17:07:00.001+08:00</published><updated>2007-03-29T17:09:30.491+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>聚合聊天工具 Miranda32</title><content type='html'>&lt;p&gt;自安装Windows2003 SP2后，因为QQ键盘保护导致系统死机所以一直没有使用QQ。也许是QQ意识到了键盘保护引起的这些问题，推出了最新版本的QQ，它能在安装时候让你选择是否使用键盘保护。但是我一直不使用原版的QQ，乱七八糟的东西太多，从最初的木子，到珊瑚虫再到现在的飘云版。但是飘云还没有推出最新版的修改版，只好作罢。&lt;/p&gt; &lt;p&gt;但是实际又不允许我不使用QQ，周围使用它的人太多了。于是找了下有没有能够兼容QQ的聊天工具，网络的那种我不喜欢，聊天还要开个网页、老板来了怎么办？:-) 于是找到Giam最新测试版，稳定版好像不支持QQ，用着不怎么顺手，最后发现了这款聚合聊天工具&lt;a href=&quot;http://miranda-im.org/&quot;&gt;Miranda32&lt;/a&gt;.如果遇到同样问题的人可以尝试一下它。&lt;/p&gt; &lt;p&gt;最好是下测试版的，我使用的是Miranda IM v0.7.0 Test Build #20，集成了很多常用的插件。也许你觉得它不够美观，No..，它可以美化界面，添加插件，总之你需要自己动手。（最近喜欢上了这种类型的软件，Firefox就不说了。foobar2000、irfanView等）。下面几篇文章是我配置的时候参照的&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blog.wdicc.com/mim/Miranda%20IM.htm&quot; target=&quot;_blank&quot;&gt;Miranda IM使用简介&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blog.donews.com/sogoo/archive/2006/05/05/857636.aspx&quot;&gt;Miranda IM 常见使用问题解答&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.cnmim.cn/search/node/%E6%96%B0%E6%89%8B%E5%85%A5%E9%97%A8&quot;&gt;Miranda 新手入门&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://miranda.lifevine.org/faq&quot; target=&quot;_blank&quot;&gt;Miranda IM 常见使用问题解答&lt;/a&gt;&lt;/p&gt; &lt;p&gt;或者直接上Google搜索Miranda。下面是我的界面&lt;/p&gt; &lt;table style=&quot;width: 100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;a title=&quot;miranda&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/438482015/&quot;&gt;&lt;img alt=&quot;miranda&quot; src=&quot;http://static.flickr.com/184/438482015_d83a34e89d.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;a title=&quot;miranda 1&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/438482049/&quot;&gt;&lt;img alt=&quot;miranda 1&quot; src=&quot;http://static.flickr.com/164/438482049_aaabe10108.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;你肯定很关心这一点，它的内存占用怎么样。我利用它开了两个QQ，MSN和Gtalk，有近15个插件，Windows 2003的任务管理器显示占用内存是30M。至于多不多就要自己判断了。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;此外如果使用IEView插件，在使用表情的时候会发现那几个表情不会动，这个和Miranda无关，到IE设置--高级--多媒体--选择在网页中播放动画。&lt;/p&gt; &lt;p&gt;PS：blogspot在中国又被封了，如果要封为什么又要解封呢？不解&lt;/p&gt; &lt;p&gt;又一个PS：&lt;a href=&quot;http://kunshou.blogspot.com/2007/03/foxyproxy.html&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;是一个简单的方法让你突破封锁，如果封锁能够简单的突破，封锁又有什么意义呢？又一个不解&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/6657996398287252233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/6657996398287252233' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/6657996398287252233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/6657996398287252233'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/miranda32.html' title='聚合聊天工具 Miranda32'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-7941425205843656888</id><published>2007-03-22T22:40:00.001+08:00</published><updated>2007-03-29T17:09:30.492+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Word 2007调整表格中公式显示格式的宏</title><content type='html'>&lt;p&gt;最近要写一个报告，正好体验了一把Word 2007，改变的确很大，界面的报道已经很多了，google、baidu搜索不知道有多少结果。我比较关心其中公式编辑器的改变，不像以前的版本使用MathType的简化版来做为公式编辑器，word 2007使用普通文本来而不是对象来描述公式（以前的版本使用嵌入对象来描述，这个方法现在仍然被支持），所以它能很好的嵌入在普通文本里面。更为重要的是据说为了新的公式编辑器，微软使用了TeX的标准和设计新的数学字体。通过实践，果然word 2007生成的公式比以前的美观了很多。下面两个你能猜出来哪个是新公式编辑器写的吗？&lt;/p&gt; &lt;p&gt;&lt;a title=&quot;eqo2007&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/430380715/&quot;&gt;&lt;img alt=&quot;eqo2007&quot; src=&quot;http://static.flickr.com/168/430380715_0ba559dbd4.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;正如上面提到的word2007的公式有两种显示方式，一种是“显示”，一种是“嵌入”。“显示”格式使公式独占一行或者表格中的一个单元格居中显示，样式比较美观。“嵌入”格式则是指把公式以普通文本的格式嵌入到段落中，样式稍微不那么美观。word默认是使用“显示”格式的。这就让我在使用中遇到了一个问题，在表格中有很多公式，每个公式独占一个单元格，按默认他们都是居中“显示”的，就算我设置单元格是左对齐它们也特立独行，所以必须把它们都改成“嵌入”，表格中公式有特别多，一个个改是在是太麻烦了，所以小看了以下VBA写了下面这个宏来完成把表格中的公式都改成“嵌入格式”&lt;/p&gt; &lt;div class=&quot;csharpcode-wrapper&quot;&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Sub&lt;/span&gt; 公式格式()&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;On&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Error&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;GoTo&lt;/span&gt; Err&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;Dim&lt;/span&gt; oTable &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; Table&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;Set&lt;/span&gt; oTable = Selection.Tables(1)&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;Dim&lt;/span&gt; oCell &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; Cell&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;For&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Each&lt;/span&gt; oCell &lt;span class=&quot;kwrd&quot;&gt;In&lt;/span&gt; oTable.Range.Cells&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;Dim&lt;/span&gt; intMathNumber &lt;span class=&quot;kwrd&quot;&gt;As&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;         intMathNumber = oCell.Range.OMaths.Count&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;If&lt;/span&gt; intMathNumber &amp;gt; 0 &lt;span class=&quot;kwrd&quot;&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;For&lt;/span&gt; i = 1 &lt;span class=&quot;kwrd&quot;&gt;To&lt;/span&gt; intMathNumber&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;                 oCell.Range.OMaths(i).ParentOMath.Type = wdOMathInline&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;End&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;Exit&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt; Err:&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt;     MsgBox (&lt;span class=&quot;str&quot;&gt;&quot;没有选中表格&quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;End&lt;/span&gt; Sub&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这个代码插件使复制成了一个问题，如果你不想手敲，点击这里下载　&lt;a href=&quot;http://www.box.net/shared/7hmm9q66nk&quot; target=&quot;_blank&quot;&gt;文本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;word 2007虽然有不少进步，但是也有不足之处，&lt;/p&gt;
&lt;p&gt;第一是录制宏好像不怎么方便，右键菜单不能用，还有那个PP菜单上的很多东西也不能点，这个好像相比2003有了很大的退步。&lt;/p&gt;
&lt;p&gt;第二就是公式的编号问题，word 2007中好像取消了公式编号，所以这个成了一个麻烦事，微软研究院的&lt;a href=&quot;http://research.microsoft.com/~dongyu/&quot; target=&quot;_blank&quot;&gt;Dong Yu&lt;/a&gt;好像也对这个问题有点奇怪，于是写了一个&lt;a href=&quot;http://research.microsoft.com/~dongyu/Office2007EqnNumber.txt&quot; target=&quot;_blank&quot;&gt;宏&lt;/a&gt;来完成这个任务，虽然我觉得不是很好用，word 2007怎么会不提供这个功能呢？&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/7941425205843656888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/7941425205843656888' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7941425205843656888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7941425205843656888'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/word-2007.html' title='Word 2007调整表格中公式显示格式的宏'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2626621488792717044</id><published>2007-03-18T12:21:00.001+08:00</published><updated>2007-03-18T12:23:00.337+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>微软网站的Windows 2003 sp2兼容应用程序列表</title><content type='html'>&lt;p&gt;在&lt;a href=&quot;http://sacranto.blogspot.com/2007/03/windows-2003-sp2.html&quot;&gt;这篇Blog&lt;/a&gt;中令我写到升级到Windows 2003 sp2后，QQ因为它采用的键盘保护技术导致系统死机的问题。&lt;/p&gt; &lt;p&gt;今天在微软的官方网站上看到了&lt;a href=&quot;http://support.microsoft.com/default.aspx?scid=kb;en-us;926031&amp;amp;sd=rss&amp;amp;spid=3198#appliesto&quot; target=&quot;_blank&quot;&gt;Windows 2003 sp2兼容应用程序列表（英文）&lt;/a&gt;，文章提到微软的测试人员测试了1500+个应用程序，测试结果包括两类，一类是通过检测的软件及其版本；另外一类当然是有问题的，提供了问题描述和可能的解决方法。&lt;/p&gt; &lt;p&gt;在这两个名单里面，我都没有看到Tencent或者QQ的名字。不过在有问题列表里面看到了许多微软自己的产品如Exchange Server 2003、ISA Server 2004等。比较引起我注意的是Microsoft Management Console (MMC) 3.0好像也可能有问题，这个我一般用的比较多像IIS，组策略等都是通过它打开的吧。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2626621488792717044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2626621488792717044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2626621488792717044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2626621488792717044'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/windows-2003-sp2_18.html' title='微软网站的Windows 2003 sp2兼容应用程序列表'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-5706867400958460167</id><published>2007-03-17T16:19:00.001+08:00</published><updated>2007-03-17T16:23:23.142+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Others"/><title type='text'>Live Writer的代码插件测试</title><content type='html'>
&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   1:&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership)
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   2:&lt;/span&gt; {
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   3:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (connection == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;) &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class=&quot;str&quot;&gt;&quot;connection&quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   4:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   5:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; mustCloseConnection = &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   6:&lt;/span&gt;     &lt;span class=&quot;rem&quot;&gt;// Create a command and prepare it for execution&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   7:&lt;/span&gt;     SqlCommand cmd = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SqlCommand();
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   8:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;try&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;   9:&lt;/span&gt;     {
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  10:&lt;/span&gt;         PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, &lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; mustCloseConnection);
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  11:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  12:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// Create a reader&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  13:&lt;/span&gt;         SqlDataReader dataReader;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  14:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  15:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// Call ExecuteReader with the appropriate CommandBehavior&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  16:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (connectionOwnership == SqlConnectionOwnership.External)
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  17:&lt;/span&gt;         {
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  18:&lt;/span&gt;             dataReader = cmd.ExecuteReader();
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  19:&lt;/span&gt;         }
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  20:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  21:&lt;/span&gt;         {
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  22:&lt;/span&gt;             dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  23:&lt;/span&gt;         }
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  24:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  25:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// Detach the SqlParameters from the command object, so they can be used again.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  26:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// HACK: There is a problem here, the output parameter values are fletched &lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  27:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// when the reader is closed, so if the parameters are detached from the command&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  28:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// then the SqlReader can磘 set its values. &lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  29:&lt;/span&gt;         &lt;span class=&quot;rem&quot;&gt;// When this happen, the parameters can磘 be used again in other command.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  30:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; canClear = &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  31:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (SqlParameter commandParameter &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; cmd.Parameters)
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  32:&lt;/span&gt;         {
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  33:&lt;/span&gt;             &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (commandParameter.Direction != ParameterDirection.Input)
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  34:&lt;/span&gt;                 canClear = &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  35:&lt;/span&gt;         }
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  36:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  37:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (canClear)
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  38:&lt;/span&gt;         {
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  39:&lt;/span&gt;             cmd.Parameters.Clear();
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  40:&lt;/span&gt;         }
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  41:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  42:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; dataReader;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  43:&lt;/span&gt;     }
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  44:&lt;/span&gt;     &lt;span class=&quot;kwrd&quot;&gt;catch&lt;/span&gt;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  45:&lt;/span&gt;     {
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  46:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (mustCloseConnection)
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  47:&lt;/span&gt;             connection.Close();
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  48:&lt;/span&gt;         &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot; class=&quot;alt&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  49:&lt;/span&gt;     }
&lt;/pre&gt;
&lt;pre xml:space=&quot;preserve&quot;&gt;
&lt;span class=&quot;lnum&quot;&gt;  50:&lt;/span&gt; }
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;还不错，和WLW结合得挺好的，暂时就先用它吧&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://lvildosola.blogspot.com/2007/02/code-snippet-plugin-for-windows-live.html&quot; target=&quot;_blank&quot;&gt;作者的blog&lt;/a&gt;，但是他给的那个插件下载地在我这里直接是登录不上去的，你呢？&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/5706867400958460167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/5706867400958460167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/5706867400958460167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/5706867400958460167'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/live-writer_17.html' title='Live Writer的代码插件测试'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-5900172991297392773</id><published>2007-03-16T13:30:00.000+08:00</published><updated>2007-03-16T14:01:27.749+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hardware"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Windows 2003下安装965主板集成显卡（GMA3000）驱动程序</title><content type='html'>&lt;p&gt;一台&lt;a href=&quot;http://www1.ap.dell.com/content/products/productdetails.aspx/optix_745?c=cn&amp;l=zh&amp;amp;s=bsd&amp;cs=cnbsd1&quot;&gt;DELL OptiPlex 745&lt;/a&gt;的商用台式机因为需要重新安装了Windows 2003系统，安装好以后插入自带的驱动程序盘，发现没有2003的驱动。那么先用xp的驱动试一下吧，主板的还好，到了显卡，出现了下面的对话框&lt;/p&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5HIxVwTXw8TvifcCzymB1QXFfQtankTSXqLYqOZk_hj-WN0wajD89rc78puYcwVpzFYUInASdxyByvEoZ59hftqzHgB8PLMaagZTWhBKssuroht_kI5FzerXruL26uP1zCm1LIFqYYUM/s1600-h/1.jpg&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5HIxVwTXw8TvifcCzymB1QXFfQtankTSXqLYqOZk_hj-WN0wajD89rc78puYcwVpzFYUInASdxyByvEoZ59hftqzHgB8PLMaagZTWhBKssuroht_kI5FzerXruL26uP1zCm1LIFqYYUM/s400/1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5042398088708486434&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;

&lt;p&gt;不知道是什么显卡，打开Everest（这个软件还真是好用），一看显示芯片是965主板集成的GMA3000（我的945集成的还是GMA950，到了965一下子就跳到3000了。难道是性能有很大的提升？）。知道了芯片就好办了，DELL、Intel和驱动之家查了一圈下来，竟然都没有它在2003下面的驱动，不是商用台式机吗？怎么也应该提供2003的驱动吧。没办法，只好试试在设备管理器里面能不能更新他的驱动，还好这个手段OK，重启。&lt;/p&gt;
&lt;p&gt;重启以后进入系统，……%￥#@！系统竟然变成了640*480*4bit的界面，而且调整分辨率也没有用，无论怎么调都停留在这个分辨率。那还不如不要装呢，不转之前还能跳到1280*1024，只是界面拖动的时候会有尾迹。于是只好在google漫无边际的搜索。&lt;/p&gt;
&lt;p&gt;最后在&lt;a href=&quot;http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30225949.aspx&quot;&gt;Intel的论坛&lt;/a&gt;看到了一个相似的问题，照着一位坛友的方法修改，重启进入系统，终于看到了如愿的界面。&lt;/p&gt;
&lt;p&gt;解决方法很简单：修改注册表 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;下的&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;LargeSystemCache&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;为0（数字零）&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;如果你修改了还不行，尝试一下重新在设备管理中更新以下驱动程序。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;LargeSystemCache&lt;span style=&quot;font-family:宋体;&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;是用来制定系统是否使用大缓存，通常来说，打开该选项会使系统性能得到相当的提升，但也有可能会使某些应用程序性能降低。需要注意的是必须有256M以上的内存，激活LargeSystemCache才能起到正面作用。不知道这个和驱动有什么具体的冲突。&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;PS：Windows 2003 下面安装Intel High Definition audio声卡之前先到微软下载这个 &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=d0934d06-15b3-4a65-8c52-746beb24e86c&amp;amp;displaylang=zh-cn&quot;&gt;补丁（中文版）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/5900172991297392773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/5900172991297392773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/5900172991297392773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/5900172991297392773'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/windows-2003965gma3000.html' title='Windows 2003下安装965主板集成显卡（GMA3000）驱动程序'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5HIxVwTXw8TvifcCzymB1QXFfQtankTSXqLYqOZk_hj-WN0wajD89rc78puYcwVpzFYUInASdxyByvEoZ59hftqzHgB8PLMaagZTWhBKssuroht_kI5FzerXruL26uP1zCm1LIFqYYUM/s72-c/1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-7885358431272901126</id><published>2007-03-15T20:29:00.001+08:00</published><updated>2007-03-15T20:30:23.434+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>升级到Windows 2003 sp2及系统不正常死机的初探</title><content type='html'>&lt;p&gt;经历过XP的sp2升级经验以后，确认不会因为升级产生某些不可控的危害以后，我决定把我的2003操作系统升级到sp2 :) ，可是，却发生了...&lt;/p&gt; &lt;p&gt;首先在&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=95ac1610-c232-4644-b828-c55eec605d55&amp;amp;DisplayLang=en&quot; target=&quot;_blank&quot;&gt;微软的下载中心&lt;/a&gt;下载大约400M的升级包，还有一种是可以刻录成光盘的下载文件，个头也比较大，估计500M左右，我选择了这个比较小的。&lt;/p&gt; &lt;p&gt;升级过程还算比较快，比Visual Studio 2005 sp1的安装快多了，而且不会出现快安装完说什么数字签名不对重来的那种情况。&lt;/p&gt; &lt;p&gt;升级完成以后进入系统，一切还比较顺畅，仿佛跟原来的没有什么区别，正在此时，电脑停止了反应，鼠标不能动，Tab键没有反应，Task manager也掉不出来，只能按Reset键重新启动，当我认为这是一个意外，重新启动机器以后，过了不到５分钟，又出现了同样的状况。我知道，某个地方出问题了&lt;/p&gt; &lt;p&gt;按照先软后硬的次序，Ghost恢复了系统（可怜我得重新安装那么一大坨软件啊），还是崩溃。接着怀疑是温度过高，拿出everest进行压力测试，温度竟然达到了110°。赶快检查cpu，把风扇拆了好好清洗了以下，又找来硅脂重新涂好，开机再测，温度是降下来了，70°左右（P4就是这样的，没用过扣肉）。正以为大功告成之时，系统又停止了响应。&lt;/p&gt; &lt;p&gt;想着就算把电脑拿去修也是一件麻烦的事情，这个死机又是不一定的，到时候怎么给别人说。就在郁闷的时候，我偶然间“终于”得到了答案。用everest进行压力测试的时候，CPU占用率会达到100%。而进行这个测试有的时候会死机，有的时候不会死机。而两者的区别我能察觉到就是QQ的打开与否。难道是QQ的原因。&lt;/p&gt; &lt;p&gt;于是上网google了以下。在这个&lt;a href=&quot;http://webnews.giga.net.tw/article/news.microsoft.com/microsoft.public.cn.windows.server.setup/3713&quot;&gt;新闻组&lt;/a&gt;看到一个人和我相同的状况。他的解决方法是&lt;font color=&quot;#ff0000&quot;&gt;删除了键盘保护的两个文件。&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;这个两个文件又在哪里呢．&lt;a href=&quot;http://blogs.itecn.net/blogs/winvista/archive/2006/09/03/3604.aspx&quot;&gt;这篇文章&lt;/a&gt;指出了是哪两个键盘保护文件导致QQ在Vista下面死机，他的解决方法是删除这个两个文件，我没有这么极端，而是把他们的名字改了。这两个文件是QQ安装文件夹下的&lt;font color=&quot;#ff0000&quot;&gt;npkcrypt.sys&lt;/font&gt;和&lt;font color=&quot;#ff0000&quot;&gt;npkcusb.sys&lt;/font&gt;两个文件。改了以后登录QQ，通知键盘保护失效，强迫让你用软键盘输入前三位密码。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#000000&quot;&gt;在网上搜索这两个文件，基本上都和腾讯QQ有联系，他们用来在输入QQ密码时进行键盘保护，腾讯是这样吹的：“采用了国际先进的nProtect键盘加密保护技术，能最大限度地防止用户的密码输入不被病毒、键盘记录程序所窃取，大大提高了QQ用户的帐号安全性。”但是好像网上对这个的破解不只一个两个，&lt;a href=&quot;http://bbs.zol.com.cn/index20060211/index_284_249.html&quot;&gt;这里&lt;/a&gt;是一个比较概念的，没有给出代码，而&lt;a href=&quot;http://blog.csdn.net/DL88250/archive/2006/12/13/1440394.aspx&quot;&gt;这里&lt;/a&gt;则直接给出了破解的C程序代码。不过我没有确认，有感兴趣的可以尝试以下。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#000000&quot;&gt;我不否认腾讯为防止QQ号被盗而做出的努力，但是使用如此复杂而又低层甚至危险的技术（至少再我看来），却不在安装的时候通知用户，而安装了以后又不让用户能够选择是否使用，导致我为了这个问题而浪费了两天的时间。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#000000&quot;&gt;PS：我觉得密码保护通过一些逻辑手段基本上已经起到了比较好的效果了，没有必要这么复杂以致引起系统死机。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#000000&quot;&gt;中国的软件商总喜欢把用户当成傻瓜。&lt;/font&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/7885358431272901126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/7885358431272901126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7885358431272901126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7885358431272901126'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2007/03/windows-2003-sp2.html' title='升级到Windows 2003 sp2及系统不正常死机的初探'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2730123878789075056</id><published>2006-12-20T20:22:00.001+08:00</published><updated>2006-12-20T20:23:30.192+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Others"/><category scheme="http://www.blogger.com/atom/ns#" term="WEB"/><title type='text'>A Data Driven Switch Menu On CodeProject.com</title><content type='html'>&lt;p&gt;Yesterday, I write a article on how to make a switch menu with javascript. Today I&amp;nbsp;read a article on codeproject.com named &lt;a href=&quot;http://www.codeproject.com/useritems/navpanel.asp&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;How To Implement a NavigationPanel Using AJAX&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt; The author do a really good work to make a Ajax data driven navigation panel by asp.net and SQL Server.&amp;nbsp;With the source code of the article&amp;nbsp;we can move data source to XML files and&amp;nbsp;so on.&amp;nbsp;&lt;/p&gt; &lt;p&gt;I decorated the code in&amp;nbsp;my last&amp;nbsp;article. Unfortunately, if you use Firefox to browse it, the style of code looks ugly. I used&amp;nbsp;the open source code coloried tool wriiten by javascript &lt;a href=&quot;http://www.dreamprojections.com/SyntaxHighlighter/&quot; target=&quot;_blank&quot;&gt;dp.SyntaxHighlighter&lt;/a&gt;. I am tring to modify it to satify my requirement better the whole day but with little result. &lt;/p&gt; &lt;p&gt;what a bad day!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2730123878789075056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2730123878789075056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2730123878789075056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2730123878789075056'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2006/12/data-driven-switch-menu-on.html' title='A Data Driven Switch Menu On CodeProject.com'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-348645296918849182</id><published>2006-12-19T21:56:00.001+08:00</published><updated>2006-12-20T22:57:49.687+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="WEB"/><title type='text'>Switch Menu In Javascript</title><content type='html'>&lt;p&gt;I formerly choose &lt;a href=&quot;http://ajax.asp.net/ajaxtoolkit/Accordion/Accordion.aspx&quot;&gt;Accordion Control&lt;/a&gt; in Microsoft Ajax Control toolkit in my application. I like menu with such switching &amp;nbsp;style. The control is well in it&#39;s appearance. For example, we can set frames per second of switching animation and fading transition effect.&lt;/p&gt; &lt;p&gt;However, I encountered the problem when I set&amp;nbsp; AsyncPostBackTrigger of updatepanel to the&amp;nbsp;LinkButton inside the accordion.&amp;nbsp;If do this,&amp;nbsp;there will be a error at runtime said that&amp;nbsp;&amp;nbsp;LinkButton1 is not exist. I found a lot of developer have the same confusion at the official forum of asp.net but I can&#39;t&amp;nbsp;get answer of it. I think this is may be control name changed when it is in a panel.&lt;/p&gt; &lt;p&gt;I tried another way to solve this problem is to&amp;nbsp;put accordion in&amp;nbsp;a&amp;nbsp;updatapanel. Unfortunately, It&amp;nbsp;still&amp;nbsp;din not&amp;nbsp;work due to LinkButton can&#39;t raised event.&lt;/p&gt; &lt;p&gt;Because I can&#39;t get the solution of it. I decided to write a switch menu in such style although the self-made one will be simple without any animation or fading effect.&lt;/p&gt; &lt;p&gt;We know we can use CSS style.display attribute to display or hide the div, control and so on. So it&#39;s not difficult to make a simple switch menu in Javascript.&amp;nbsp;At first we made menu in html&lt;/p&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;nav-secondary&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;Menu1&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;onclick&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;SwitchMenu(&#39;Menu1&#39;,&#39;nav-secondary&#39;)&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Menu&amp;nbsp;1&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;style&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;display:&amp;nbsp;none;&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;A1&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Sub&amp;nbsp;Menu&amp;nbsp;1.1&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;A6&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Sub&amp;nbsp;Menu&amp;nbsp;1.2&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;Menu2&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;onclick&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;SwitchMenu(&#39;Menu2&#39;,&#39;nav-secondary&#39;)&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Menu&amp;nbsp;2&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;style&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;display:&amp;nbsp;none;&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;A5&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Sub&amp;nbsp;Menu&amp;nbsp;2.1&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;A7&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Sub&amp;nbsp;Menu&amp;nbsp;2.2&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;Menu3&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;onclick&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;SwitchMenu(&#39;Menu3&#39;,&#39;nav-secondary&#39;)&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Menu&amp;nbsp;3&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;style&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;display:&amp;nbsp;none;&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;A2&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Sub&amp;nbsp;Menu&amp;nbsp;3.1&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;A3&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Sub&amp;nbsp;Menu&amp;nbsp;3.2&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;href&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;#&quot;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&quot;A4&quot;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;Sub&amp;nbsp;Menu&amp;nbsp;3.3&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;lt;/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;ul&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;&lt;/font&gt; &lt;/div&gt; &lt;p&gt;SwitchMenu is defined in the Javascript to display or hide the sub menu. note is added. the statement used to set CSS class is optional&lt;/p&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;blue&quot;&gt;var&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;currentMenu;&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;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Global&amp;nbsp;variable:&amp;nbsp;current&amp;nbsp;menu&lt;/font&gt;&lt;/div&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;darkgreen&quot;&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Parameter&amp;nbsp;obj&amp;nbsp;is&amp;nbsp;the&amp;nbsp;menu&amp;nbsp;you&amp;nbsp;clicked,&amp;nbsp;container&amp;nbsp;is&amp;nbsp;the&amp;nbsp;container&amp;nbsp;layer&amp;nbsp;of&amp;nbsp;menu&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;function&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;SwitchMenu(obj,container){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;if&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;document&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;.getElementById(container)){&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;if&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;(currentMenu!&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=null&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;)&amp;nbsp;{&lt;/font&gt;&lt;/div&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;black&quot;&gt;&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=&quot;darkgreen&quot;&gt;//Clear&amp;nbsp;css&amp;nbsp;style&amp;nbsp;of&amp;nbsp;current&amp;nbsp;menu&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;currentMenu.className&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/div&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;black&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;font color=&quot;darkgreen&quot;&gt;//Get&amp;nbsp;the&amp;nbsp;target&amp;nbsp;menu&amp;nbsp;you&amp;nbsp;clicked&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;var&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;targetMenu&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;document&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;.getElementById(obj)&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/div&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;darkgreen&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;darkgreen&quot;&gt;//Get&amp;nbsp;sub-menu&amp;nbsp;of&amp;nbsp;target&amp;nbsp;menu&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;var&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;secondaryMenu&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;targetMenu.getElementsByTagName(&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;UL&quot;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;)[&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;]&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;var&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;secondaryMenus&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;document&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;.getElementById(container).getElementsByTagName(&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;UL&quot;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;//get&amp;nbsp;all&amp;nbsp;submenus&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;if&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;(secondaryMenu&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;==null&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;//No&amp;nbsp;sub&amp;nbsp;menu&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;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;for&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;var&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;i&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;i&amp;lt;secondaryMenus.length&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;i++){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/div&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;black&quot;&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;&lt;font color=&quot;darkgreen&quot;&gt;//Hide&amp;nbsp;all&amp;nbsp;sub&amp;nbsp;menu&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&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;&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;secondaryMenus[i].style.display&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;none&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&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;&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;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;}&lt;/font&gt;&lt;/div&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;black&quot;&gt;&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=&quot;darkgreen&quot;&gt;//Set&amp;nbsp;target&amp;nbsp;menu&amp;nbsp;css&amp;nbsp;class&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;targetMenu.className&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;active&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&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;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&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;&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&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Sub&amp;nbsp;menu&amp;nbsp;Exist&lt;/font&gt;&lt;/div&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;darkgreen&quot;&gt;&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=&quot;darkgreen&quot;&gt;//Click&amp;nbsp;the&amp;nbsp;&amp;nbsp;menu&amp;nbsp;which&amp;nbsp;sub-menu&amp;nbsp;is&amp;nbsp;hide&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;if&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;(secondaryMenu.style.display&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;==&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;none&quot;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&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;&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;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;for&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;var&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;i&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;i&amp;lt;secondaryMenus.length&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;i++){&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;&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;secondaryMenus[i].style.display&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;none&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Hide&amp;nbsp;all&amp;nbsp;sub&amp;nbsp;menu&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;&lt;/font&gt;&lt;font color=&quot;black&quot;&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;secondaryMenu.style.display&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;block&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&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;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Display&amp;nbsp;sub-menu&amp;nbsp;u&amp;nbsp;clicked&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;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;targetMenu.className&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;active&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&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&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Set&amp;nbsp;target&amp;nbsp;menu&amp;nbsp;css&amp;nbsp;class&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;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;black&quot;&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;&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&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Click&amp;nbsp;the&amp;nbsp;&amp;nbsp;menu&amp;nbsp;which&amp;nbsp;sub-menu&amp;nbsp;is&amp;nbsp;displayed&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;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;secondaryMenu.style.display&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;none&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&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;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Hide&amp;nbsp;it&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;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;targetMenu.className&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#808080&quot;&gt;&quot;&quot;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&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;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;}&lt;br&gt;&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;currentMenu&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;=&amp;nbsp;document&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;.getElementById(obj)&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;//Set&amp;nbsp;current&amp;nbsp;menu&amp;nbsp;(global&amp;nbsp;variable)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;black&quot;&gt;}&lt;br&gt;}&lt;/font&gt; &lt;/div&gt; &lt;p&gt;Ok, run it in your browser. it works fine, right? &lt;/p&gt; &lt;p&gt;Maybe additional css make appearance better&lt;/p&gt; &lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;darkgreen&quot;&gt;/*&amp;nbsp;SECONDARY&amp;nbsp;NAVIGATION&amp;nbsp;-&amp;nbsp;vertical&amp;nbsp;navigation&amp;nbsp;*/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;ul&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;position&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:static}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;list-style&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;none;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;margin&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:0;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;padding&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:0;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;background&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:#fff}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;padding-top&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:0;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;border-top&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#ccc;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;margin-top&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;1px}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;line-height&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:1.8;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;padding&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;5px&amp;nbsp;0&amp;nbsp;5px&amp;nbsp;23px;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;background&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;#fff&amp;nbsp;url(&quot;images/sprites.gif&quot;)&amp;nbsp;no-repeat&amp;nbsp;10px&amp;nbsp;-695px;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;font&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;bold&amp;nbsp;86%&amp;nbsp;arial;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;display&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:block}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;link&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;visited&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;hover&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;text-decoration&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:none;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;cursor&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:pointer}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;link&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;color&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:#000}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;visited&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;color&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:#000}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;hover&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;color&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:#c00;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;background&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;#fee&amp;nbsp;url(&quot;images/sprites.gif&quot;)&amp;nbsp;no-repeat&amp;nbsp;10px&amp;nbsp;-695px}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;link&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;visited&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;hover&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;color&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:#c00}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;border-top&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#fff;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;border-bottom&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#ccc}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;darkgreen&quot;&gt;/*&amp;nbsp;SECONDARY&amp;nbsp;NAVIGATION&amp;nbsp;-&amp;nbsp;2nd&amp;nbsp;TIER&amp;nbsp;*/&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;ul&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;margin&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;0&amp;nbsp;0&amp;nbsp;1em&amp;nbsp;23px;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;padding&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:0}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;link&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;visited&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;line-height&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:1.5;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;background&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;#fff&amp;nbsp;url(&quot;images/sprites.gif&quot;)&amp;nbsp;no-repeat&amp;nbsp;0&amp;nbsp;-798px;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;padding&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:0&amp;nbsp;0&amp;nbsp;0&amp;nbsp;12px;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;font-weight&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:normal;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;width&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:auto;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;color&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:#000;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;width&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:130px;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;display&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:block}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;hover&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;color&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;#c00}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;border&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&amp;nbsp;none;&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;margin&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:0}&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;link&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;visited&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;hover&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;#&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;nav-secondary&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;li&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;a&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;maroon&quot;&gt;active&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;font-weight&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;:bold}&lt;/font&gt; &lt;/div&gt; &lt;p&gt;These are the final snap in my FireFox2 and IE7&lt;/p&gt; &lt;p&gt;&lt;a title=&quot;switchmenu&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/327154365/&quot;&gt;&lt;img alt=&quot;switchmenu&quot; src=&quot;http://static.flickr.com/139/327154365_71abdb5bf3.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/348645296918849182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/348645296918849182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/348645296918849182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/348645296918849182'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2006/12/switch-menu-in-javascript.html' title='Switch Menu In Javascript'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-4933498027249585660</id><published>2006-12-18T15:47:00.001+08:00</published><updated>2006-12-18T15:47:06.274+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="WEB"/><title type='text'>Some Tips From Atlas To Microsoft Ajax RC1</title><content type='html'>&lt;p&gt;These days I am busy on move a old atlas application to newer Microsoft Ajax RC1. During This process I encountered some problem and get some tips.&lt;/p&gt; &lt;p&gt;1. Trigger.ControlEventName in UpdatePanel are&amp;nbsp;modified to Trigger.AsyncPostBackTrigger.&amp;nbsp;I think this is more meanningful. it also add &amp;nbsp;PostBackTrigger propery to force control refresh in updatepanel. &lt;/p&gt; &lt;p&gt;2. $ changed to $get which is short of Document.GetElementByID in order to conflict to other ajax library such as prototype. Add shortcut $addHandler to listen event of control in client script&lt;/p&gt; &lt;p&gt;3. Page.RegisterStarupScript is moved to System.Web.UI.ScriptManager.RegisterStartupScript. The function add a paremeter of Control.&lt;/p&gt; &lt;p&gt;4. The biggest change&amp;nbsp;affected me is PageMothods which I used to communicate between javascript and server code. Now It must be public and static. In former application I use lot&#39; of un-static method in it. I could not change all of these function to static. so I use RegisterStarupScript&amp;nbsp; instead of it to pass server data to javascript.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/4933498027249585660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/4933498027249585660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/4933498027249585660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/4933498027249585660'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2006/12/some-tips-from-atlas-to-microsoft-ajax.html' title='Some Tips From Atlas To Microsoft Ajax RC1'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-2317736705802852474</id><published>2006-12-08T22:39:00.001+08:00</published><updated>2006-12-08T22:45:12.196+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="WEB"/><title type='text'>Auto-Activate ActiveX Controls in The Web Page</title><content type='html'>&lt;p&gt;Microsoft has made changes to the way that newest Internet Explorer handles some content in Web pages due to security reason. When Internet Explorer encounters a page with ActiveX controls (such as a page using PI-ActiveView to show&amp;nbsp;.pdi file), the control may require a single click to activate. (the newest Internet Explorer represent If user installed &lt;a href=&quot;http://support.microsoft.com/kb/912945/en-us&quot;&gt;security update 912812&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;Let us take PI-ActiveView as a example.When you open the page embed .pdi, a tooltip will appear to prompt you that the control should be clicked to first activate before it can interact.&lt;/p&gt; &lt;p&gt;&lt;a title=&quot;001&quot; href=&quot;http://www.flickr.com/photos/67826450@N00/317097753/&quot;&gt;&lt;img alt=&quot;001&quot; src=&quot;http://static.flickr.com/122/317097753_81577aeb25.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;When a control is inactive, the following effects occur&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Dynamic HTML events related to user interaction, such as onblur and onclick, are blocked.&lt;/p&gt; &lt;li&gt; &lt;p&gt;The control does not respond to window messages generated by the keyboard or mouse, such as WM_CLICK and WM_KEYPRESS, and so on.&lt;/p&gt; &lt;li&gt; &lt;p&gt;An overlay window, created on the control&#39;s OLE site, prevents keyboard and mouse messages from reaching the inactive control.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This requirement to click to activate will happen each time you refresh or visit the Web page. This is a annoying to user. Fortunately, developers can rewrite web pages so that users are never presented with a tooltip when they visit the page acording &lt;a href=&quot;http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/overview/activating_activex.asp&quot;&gt;the artilcel&amp;nbsp;on MSDN&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The article&#39;s keystone is using script(jscript or vbscript) to load controls from external script files, Then web pages will load interactive controls that respond immediately to user input. Be careful that the script written inline programmatically, for example with the &lt;a href=&quot;http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/writeln.asp&quot;&gt;writeln&lt;/a&gt; function, the loaded control will behave as if it was loaded by the HTML document itself and will require activation. &lt;/p&gt; &lt;p&gt;The detail way is stated clearly&amp;nbsp;in the above article. I need not to copy them here. ^-^&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;PS: I have a question. The requirement to click to activate ActiveX controls is due to security reason. will this solution make us go back to un-secure time we do not install update and need not to click to activate !&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/2317736705802852474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/2317736705802852474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2317736705802852474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/2317736705802852474'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2006/12/auto-activate-activex-controls-in-web.html' title='Auto-Activate ActiveX Controls in The Web Page'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1077856587402283212.post-7704471256497537224</id><published>2006-12-08T09:30:00.001+08:00</published><updated>2006-12-08T09:34:33.517+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Emotion"/><title type='text'>LYC Anniversary 4</title><content type='html'>&lt;p&gt;Lyc is not short for china new star but the&amp;nbsp; abbreviation for my girlfriend&#39; name&amp;nbsp;and mine. Today is 4 anniversary of us. I still remember 4 years ago&amp;nbsp;what &amp;nbsp;a nervous&amp;nbsp;man I am when I went along with her. Although we had displeasure ever, now we are harmonious and deeply love each other.&lt;/p&gt; &lt;p&gt;No more word I express and want to express. Congratulation and wish we&amp;nbsp;be more and more better!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://sacranto.blogspot.com/feeds/7704471256497537224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1077856587402283212/7704471256497537224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7704471256497537224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1077856587402283212/posts/default/7704471256497537224'/><link rel='alternate' type='text/html' href='http://sacranto.blogspot.com/2006/12/lyc-anniversary-4.html' title='LYC Anniversary 4'/><author><name>sacranto</name><uri>http://www.blogger.com/profile/02154609421386003924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/122/309379494_b5d6659bc6_m.jpg'/></author><thr:total>0</thr:total></entry></feed>