﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Timothy&#039;s Space &#187; plugin</title>
	<atom:link href="http://www.xiaozhou.net/tag/plugin/feed" rel="self" type="application/rss+xml" />
	<link>http://www.xiaozhou.net</link>
	<description>君看一叶舟，出没风波里</description>
	<lastBuildDate>Fri, 03 Feb 2012 17:24:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>WP-Reader-Wall 插件兼容 WordPress 3.0的修改</title>
		<link>http://www.xiaozhou.net/aboutsite/wordpress/modification_of_wp-reader-wall_to_fit_wordpress-3-0-2010-07-22.htm</link>
		<comments>http://www.xiaozhou.net/aboutsite/wordpress/modification_of_wp-reader-wall_to_fit_wordpress-3-0-2010-07-22.htm#comments</comments>
		<pubDate>Wed, 21 Jul 2010 17:02:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[reader]]></category>
		<category><![CDATA[wall]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[读者墙]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/aboutsite/wordpress/wp-reader-wall-%e6%8f%92%e4%bb%b6%e5%85%bc%e5%ae%b9-wordpress-3-0%e7%9a%84%e4%bf%ae%e6%94%b9-2010-07-22.htm</guid>
		<description><![CDATA[wp-reader-wall是个有意思的插件，能在页面列出最近评论过的同学的头像。采用照片墙的方式，展示给用户，并且，头像的排序是根据评论的条数来排序的。 自从上次升级WordPress到3.0后，发现者插件没有正常工作了，索性禁用了此插件，也没时间仔细研究。今天特闲，所以决定拿这插件来研究研究。发现导致插件工作不正常的地方，是在插件的代码中定义select的sql语句，取读者数据的时候出了问题。把这句sql从插件中挖出来，在线上环境的mysql中执行了一下，果然取不到数据。刚开始，怀疑是sql语句的where条件的问题，后来逐个排除，没发现异常。最后，把重点放在了表名上，插件里面是用的一个全局变量：$tablecomments 来表示评论的表，索性直接替换成wp_comments试试，果然能取到数据了。看来$tablecomments在WordPress 3.0中失效了。去wordpress搜了一下，官方提到$tablecomments变量是不推崇的方式，可能已经被弃用。官方还建议了一些其他的全局变量的替代办法，如下： 这样，我们可以遵循官方的建议，在WP-Reader-Wall插件的select语句中，用$wpdb-&#62;comments替代原来的$tablecomments，这样，插件就能正常在WordPress 3.0下使用了。总结了一下，关于WordPress升级遇到的一些问题，可以直接查阅官方文档，还有就是参考每个版本之间的变化，包括变量定义，以及数据库改动。这才是最好，最直接的办法。 具体修改方法，在WP-Reader-Wall.php中，找到如下的代码: ?View Code PHP1 $request = &#34;SELECT count(comment_ID) comment_nums,comment_author, comment_author_email,comment_author_url FROM $tablecomments where comment_date》'&#34;.$cur_time_span.&#34;' AND comment_type='' AND comment_approved=1 group by comment_author_email order by count(comment_ID) DESC &#34;; 修改为： ?View Code PHP1 2 3 $request = &#34;SELECT count(comment_ID) comment_nums,comment_author, comment_author_email,comment_author_url FROM &#34;.$wpdb-&#62;comments. &#34; where comment_date&#62;'&#34;.$cur_time_span.&#34;' AND comment_type='' AND comment_approved=1 group by [...]]]></description>
			<content:encoded><![CDATA[<p>wp-reader-wall是个有意思的插件，能在页面列出最近评论过的同学的头像。采用照片墙的方式，展示给用户，并且，头像的排序是根据评论的条数来排序的。    <br />自从上次升级WordPress到3.0后，发现者插件没有正常工作了，索性禁用了此插件，也没时间仔细研究。今天特闲，所以决定拿这插件来研究研究。发现导致插件工作不正常的地方，是在插件的代码中定义select的sql语句，取读者数据的时候出了问题。把这句sql从插件中挖出来，在线上环境的mysql中执行了一下，果然取不到数据。刚开始，怀疑是sql语句的where条件的问题，后来逐个排除，没发现异常。最后，把重点放在了表名上，插件里面是用的一个全局变量：$tablecomments 来表示评论的表，索性直接替换成wp_comments试试，果然能取到数据了。看来$tablecomments在WordPress 3.0中失效了。去wordpress搜了一下，官方提到$tablecomments变量是不推崇的方式，可能已经被弃用。官方还建议了一些其他的全局变量的替代办法，如下：</p>
<p><a href="http://www.xiaozhou.net/pics/WPReaderWallWordPress3.0_D73/image.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.xiaozhou.net/pics/WPReaderWallWordPress3.0_D73/image_thumb.png" width="644" height="230" /></a>这样，我们可以遵循官方的建议，在WP-Reader-Wall插件的select语句中，用$wpdb-&gt;comments替代原来的$tablecomments，这样，插件就能正常在WordPress 3.0下使用了。总结了一下，关于WordPress升级遇到的一些问题，可以直接查阅官方文档，还有就是参考每个版本之间的变化，包括变量定义，以及数据库改动。这才是最好，最直接的办法。 </p>
</p>
<p>具体修改方法，在WP-Reader-Wall.php中，找到如下的代码:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p767code3'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p7673"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p767code3"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT count(comment_ID) comment_nums,comment_author, comment_author_email,comment_author_url FROM <span style="color: #006699; font-weight: bold;">$tablecomments</span>  where comment_date》'&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$cur_time_span</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;' AND comment_type='' AND comment_approved=1 group by comment_author_email order by count(comment_ID) DESC &quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>修改为：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p767code4'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p7674"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p767code4"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT count(comment_ID) comment_nums,comment_author, comment_author_email,comment_author_url FROM &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comments</span><span style="color: #339933;">.</span>
<span style="color: #0000ff;">&quot; where comment_date&gt;'&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$cur_time_span</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;' AND comment_type='' AND comment_approved=1 group by comment_author_email order by count(comment
_ID) DESC &quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/aboutsite/wordpress/modification_of_wp-reader-wall_to_fit_wordpress-3-0-2010-07-22.htm/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>启用Lazy Load插件</title>
		<link>http://www.xiaozhou.net/aboutsite/wordpress/lazy_load_plugin_enabled-2010-06-19.htm</link>
		<comments>http://www.xiaozhou.net/aboutsite/wordpress/lazy_load_plugin_enabled-2010-06-19.htm#comments</comments>
		<pubDate>Sat, 19 Jun 2010 10:21:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[lazy]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[延迟加载]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/aboutsite/wordpress/%e5%90%af%e7%94%a8lazy-load%e6%8f%92%e4%bb%b6-2010-06-19.htm</guid>
		<description><![CDATA[Lazy Load是基于jQuery的插件，能让页面的加载更加有序。在遇到图片比较多的页面的时候，就更能派上用场了。由于Blog加载了jQuery，正好也可以用上这个。 具体的设置，可以参考A-Shun同学的相关文章。启用后试用了一下，效果还不错。推荐有兴趣的同学也试试。 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>Lazy Load是基于jQuery的插件，能让页面的加载更加有序。在遇到图片比较多的页面的时候，就更能派上用场了。由于Blog加载了jQuery，正好也可以用上这个。</p>
<p>具体的设置，可以参考A-Shun同学的<a href="http://www.a-shun.com/archives/21363.html" target="_blank">相关文章</a>。启用后试用了一下，效果还不错。推荐有兴趣的同学也试试。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/aboutsite/wordpress/lazy_load_plugin_enabled-2010-06-19.htm/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Blog插件更新</title>
		<link>http://www.xiaozhou.net/aboutsite/wordpress/blog_plugins_updated-2010-06-12.htm</link>
		<comments>http://www.xiaozhou.net/aboutsite/wordpress/blog_plugins_updated-2010-06-12.htm#comments</comments>
		<pubDate>Fri, 11 Jun 2010 17:03:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[更新]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/aboutsite/wordpress/blog%e6%8f%92%e4%bb%b6%e6%9b%b4%e6%96%b0-2010-06-12.htm</guid>
		<description><![CDATA[很久没整理下Blog了，这次对Blog的一些插件做了一些调整和更新。 为了优化一下Blog访问速度和用户体验，正式启用了WP Super Cache插件。Nginx下需要单独在配置文件中设置一下，生效后，随便访问几个页面，看到Blog的wp-content/cache目录下生成文件了，表示成功启用了。设置的方式，可以参考久酷同学的一篇文章。 另外，貌似WP Super Cache插件和WP-PostViews插件有一些冲突，启用了WP Super Cache后，发现文章计数停住不动了，估计是因为生成了静态页面的关系。想了一下，俺的文章其实访问量并不是很大，显示一下文章访问量意义也不太明显，所以为了性能的缘故，暂时停用了WP-PostViews插件。网上貌似有关于这两个插件冲突的解决方法，不过今天暂时没时间细细研究了，空了再试试。 最后，替换掉一个评论者信息的插件Comment Info Detector,感觉WP-UserAgent能检测的浏览器和操作系统的版本更多一些，所以用了它。 其实俺比较喜欢的是WP Super Cache这个插件，希望它对Blog的访问速度有一定的提升。嗯，观察几天Blog访问情况就知道结果了。 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>很久没整理下Blog了，这次对Blog的一些插件做了一些调整和更新。<br />
为了优化一下Blog访问速度和用户体验，正式启用了<a href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">WP Super Cache</a>插件。Nginx下需要单独在配置文件中设置一下，生效后，随便访问几个页面，看到Blog的wp-content/cache目录下生成文件了，表示成功启用了。设置的方式，可以参考<a href="http://www.jiucool.com/wp-super-cache-nginx/" target="_blank">久酷同学的一篇文章</a>。<br />
另外，貌似<a href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">WP Super Cache</a>插件和<a href="http://lesterchan.net/portfolio/programming/php/" target="_blank">WP-PostViews</a>插件有一些冲突，启用了<a href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">WP Super Cache</a>后，发现文章计数停住不动了，估计是因为生成了静态页面的关系。想了一下，俺的文章其实访问量并不是很大，显示一下文章访问量意义也不太明显，所以为了性能的缘故，暂时停用了<a href="http://lesterchan.net/portfolio/programming/php/" target="_blank">WP-PostViews</a>插件。网上貌似有关于这两个插件冲突的解决方法，不过今天暂时没时间细细研究了，空了再试试。<br />
最后，替换掉一个评论者信息的插件<a href="http://wordpress.org/extend/plugins/comment-info-detector/" target="_blank">Comment Info Detector</a>,感觉<a href="http://wordpress.org/extend/plugins/wp-useragent/" target="_blank">WP-UserAgent</a>能检测的浏览器和操作系统的版本更多一些，所以用了它。<br />
其实俺比较喜欢的是<a href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">WP Super Cache</a>这个插件，希望它对Blog的访问速度有一定的提升。嗯，观察几天Blog访问情况就知道结果了。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/aboutsite/wordpress/blog_plugins_updated-2010-06-12.htm/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>WordPress插件介绍:WP-CodeBox</title>
		<link>http://www.xiaozhou.net/aboutsite/wordpress/introduce_of_wp_codebox-2010-05-21.htm</link>
		<comments>http://www.xiaozhou.net/aboutsite/wordpress/introduce_of_wp_codebox-2010-05-21.htm#comments</comments>
		<pubDate>Fri, 21 May 2010 15:06:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[box]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/aboutsite/wordpress/wp-codebox%e6%8f%92%e4%bb%b6%e4%bb%8b%e7%bb%8d-2010-05-21.htm</guid>
		<description><![CDATA[WP-CodeBox 是我的WordPress一直使用的，一个可以方便的在文章中嵌入代码的插件。它使用起来非常便捷，而且支持众多的编程语言，对于咱开发人员来说，真的是一大福音。当初从wordpress.org的官网比较了几款代码插入的插件，最终我还是选择了它。CodeBox除了支持众多编程语言外，而且在展示代码的时候，有漂亮的外观(如下图)，并且代码框使用脚本实现了动态的代码折叠效果。在浏览的时候，用户可以通过单击按钮随时折叠代码，也节约了屏幕空间。 CodeBox的使用也非常简单，举个最简单的例子，只要在文章中写入下列代码，插入你的程序代码即可： insert your code here… 其中的language code，是编程语言的代码，让插件知道，你插入的代码是属于哪种语言。 当然还可以插入文件，供别人下载，也可以通过设置让其是否显示折叠和代码行，等等，相关功能都可以在wordpress官网中该插件的页面找到。 对于CodeBox支持的众多编程语言，俺在OneNote中整理了一份language code和具体编程语言的对照表，这样可以一目了然的知道你的编程语言，对应的language code是啥了。我把对照表导出成一了份PDF，放在俺的Sky Drive，供大家下载。 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordpress.org/extend/plugins/wp-codebox/" target="_blank">WP-CodeBox</a> 是我的WordPress一直使用的，一个可以方便的在文章中嵌入代码的插件。它使用起来非常便捷，而且支持众多的编程语言，对于咱开发人员来说，真的是一大福音。当初从wordpress.org的官网比较了几款代码插入的插件，最终我还是选择了它。CodeBox除了支持众多编程语言外，而且在展示代码的时候，有漂亮的外观(如下图)，并且代码框使用脚本实现了动态的代码折叠效果。在浏览的时候，用户可以通过单击按钮随时折叠代码，也节约了屏幕空间。<br />
<a href="http://www.xiaozhou.net/pics/WPCodeBox_1451D/image.png"><img style="display: inline; border-width: 0px;" title="image" src="http://www.xiaozhou.net/pics/WPCodeBox_1451D/image_thumb.png" border="0" alt="image" width="644" height="110" /></a></p>
<p>CodeBox的使用也非常简单，举个最简单的例子，只要在文章中写入下列代码，插入你的程序代码即可：<br />
<span style="color: #0000ff;">
<pre lang=”language code”>
insert your code here…
</pre>
<p></span><br />
其中的language code，是编程语言的代码，让插件知道，你插入的代码是属于哪种语言。<br />
当然还可以插入文件，供别人下载，也可以通过设置让其是否显示折叠和代码行，等等，相关功能都可以在wordpress官网中该插件的页面找到。<br />
对于CodeBox支持的众多编程语言，俺在OneNote中整理了一份language code和具体编程语言的对照表，这样可以一目了然的知道你的编程语言，对应的language code是啥了。我把对照表导出成一了份PDF，放在俺的Sky Drive，供大家<a href="http://cid-46943f6d706e10e1.skydrive.live.com/browse.aspx/.Public" target="_blank">下载</a>。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/aboutsite/wordpress/introduce_of_wp_codebox-2010-05-21.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>新增博客插件–Mail To Commenter</title>
		<link>http://www.xiaozhou.net/aboutsite/wordpress/add_blog_plugin_mail_to_commenter-2010-01-06.htm</link>
		<comments>http://www.xiaozhou.net/aboutsite/wordpress/add_blog_plugin_mail_to_commenter-2010-01-06.htm#comments</comments>
		<pubDate>Tue, 05 Jan 2010 16:20:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[commenter]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/aboutsite/wordpress/blog%e6%96%b0%e5%a2%9e%e6%8f%92%e4%bb%b6-mail-to-commenter-2010-01-06.htm</guid>
		<description><![CDATA[新增了一个轻量级的邮件通知回复的插件:Mail To Commenter。从现在开始，博友可以通过邮件收到偶回复留言的通知了。开始本来打算使用Thread Comment的，最后还是放弃了，选择了Mail To Commenter。该插件的使用和配置也很方便，由咱国人开发。 插件主页：http://www.thinkagain.cn/archives/989.html 插件下载地址：http://wordpress.org/extend/plugins/mailtocommenter/ 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>新增了一个轻量级的邮件通知回复的插件:Mail To Commenter。从现在开始，博友可以通过邮件收到偶回复留言的通知了。开始本来打算使用Thread Comment的，最后还是放弃了，选择了Mail To Commenter。该插件的使用和配置也很方便，由咱国人开发。</p>
<p>插件主页：<a title="http://www.thinkagain.cn/archives/989.html" href="http://www.thinkagain.cn/archives/989.html">http://www.thinkagain.cn/archives/989.html</a><br />
插件下载地址：<a title="http://wordpress.org/extend/plugins/mailtocommenter/" href="http://wordpress.org/extend/plugins/mailtocommenter/">http://wordpress.org/extend/plugins/mailtocommenter/</a></p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/aboutsite/wordpress/add_blog_plugin_mail_to_commenter-2010-01-06.htm/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>新增博客插件–Comment Info Detector</title>
		<link>http://www.xiaozhou.net/aboutsite/wordpress/new_blog_plugin_comment_info_detector-2009-12-29.htm</link>
		<comments>http://www.xiaozhou.net/aboutsite/wordpress/new_blog_plugin_comment_info_detector-2009-12-29.htm#comments</comments>
		<pubDate>Tue, 29 Dec 2009 14:24:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[Detector]]></category>
		<category><![CDATA[Info]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/aboutsite/wordpress/%e6%96%b0%e5%a2%9e%e5%8d%9a%e5%ae%a2%e6%8f%92%e4%bb%b6-comment-info-detector-2009-12-29.htm</guid>
		<description><![CDATA[一个很有趣的插件，能显示博客评论者的相关信息，并以图标的方式显示出来，包括评论者IP所在的国家、浏览器、操作系统，这种统计还是比较有意思，也相当直观，看图吧： 安装过程也很方便，后台直接启用，然后小小设置一下，就OK了。 插件官方地址：http://hieudt.info/wp-plugins/comment-info-detector/ 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>一个很有趣的插件，能显示博客评论者的相关信息，并以图标的方式显示出来，包括评论者IP所在的国家、浏览器、操作系统，这种统计还是比较有意思，也相当直观，看图吧：</p>
<p><a href="http://www.xiaozhou.net/pics/CommentInfoDetector_13B38/CommentInfoDetector.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="CommentInfoDetector" border="0" alt="CommentInfoDetector" src="http://www.xiaozhou.net/pics/CommentInfoDetector_13B38/CommentInfoDetector_thumb.jpg" width="538" height="213" /></a> </p>
<p>安装过程也很方便，后台直接启用，然后小小设置一下，就OK了。</p>
<p>插件官方地址：<a title="http://hieudt.info/wp-plugins/comment-info-detector/" href="http://hieudt.info/wp-plugins/comment-info-detector/">http://hieudt.info/wp-plugins/comment-info-detector/</a></p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/aboutsite/wordpress/new_blog_plugin_comment_info_detector-2009-12-29.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>手机版博客更新了插件</title>
		<link>http://www.xiaozhou.net/aboutsite/wordpress/mobilepress_plugin_updated-2009-12-25.htm</link>
		<comments>http://www.xiaozhou.net/aboutsite/wordpress/mobilepress_plugin_updated-2009-12-25.htm#comments</comments>
		<pubDate>Fri, 25 Dec 2009 15:38:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[MobilePress]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wp-t-wap]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[更新]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/aboutsite/wordpress/%e6%89%8b%e6%9c%ba%e7%89%88%e5%8d%9a%e5%ae%a2%e6%9b%b4%e6%96%b0%e4%ba%86%e6%8f%92%e4%bb%b6-2009-12-25.htm</guid>
		<description><![CDATA[一直以来，我的blog用的wp-t-wap插件实现博客的手机浏览，感觉还不错，插件启用时，会自动生成手机浏览所需的页面文件。无意中发现博客好友久酷同学在使用MobilePress，自己去down了一个，试用了一下，果然不错，比起wp-t-wap更轻量级，插件支持多种主题以及自定义主题。而且插件启用后，能够自动识别访问的客户端，如果发现是手机等移动设备，就自动启用MobilePress的主题，相当方便。推荐还没有安装的同学使用。插件的安装和设置也很简单，就不在此累述了…… MobilePress 插件 下载地址： http://wordpress.org/extend/plugins/mobilepress/ 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>一直以来，我的blog用的wp-t-wap插件实现博客的手机浏览，感觉还不错，插件启用时，会自动生成手机浏览所需的页面文件。无意中发现博客好友<a href="http://www.jiucool.com" target="_blank">久酷</a>同学在使用MobilePress，自己去down了一个，试用了一下，果然不错，比起wp-t-wap更轻量级，插件支持多种主题以及自定义主题。而且插件启用后，能够自动识别访问的客户端，如果发现是手机等移动设备，就自动启用MobilePress的主题，相当方便。推荐还没有安装的同学使用。插件的安装和设置也很简单，就不在此累述了……</p>
<p>MobilePress 插件   <br />下载地址： <a href="http://wordpress.org/extend/plugins/mobilepress/">http://wordpress.org/extend/plugins/mobilepress/</a></p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/aboutsite/wordpress/mobilepress_plugin_updated-2009-12-25.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (五) Plugins Manager 源码下载</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-5-plugins-manager-source-code-download-2008-04-01.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-5-plugins-manager-source-code-download-2008-04-01.htm#comments</comments>
		<pubDate>Tue, 01 Apr 2008 15:17:44 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[下载]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[源码]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=191</guid>
		<description><![CDATA[今天和同事一起把Plugins Manager放在了google code上面。大家可以从下面的地址获取所有的源码了。 http://code.google.com/p/dynamic-plugins-manager/ 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>今天和同事一起把Plugins Manager放在了google code上面。大家可以从下面的地址获取所有的源码了。</p>
<p>http://code.google.com/p/dynamic-plugins-manager/</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-5-plugins-manager-source-code-download-2008-04-01.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (四) 插件及Demo源码下载</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-4-plug-ins-and-source-code-download-demo-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-4-plug-ins-and-source-code-download-demo-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 08:12:16 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[下载]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[源码]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=190</guid>
		<description><![CDATA[这里提供了插件的Demo程序，和编译好的Plugin Manager下载。 Plugin Manager的代码待整理后放上来。[cool] 开发运行环境： Windows Vista Ultimate .NET Framework 3.5 Microsoft Visual Studio 2008 点击下载此文件 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>这里提供了插件的Demo程序，和编译好的Plugin Manager下载。<br />
   Plugin Manager的代码待整理后放上来。[cool]</p>
<p>    开发运行环境：<br />
   Windows Vista Ultimate<br />
     .NET Framework 3.5<br />
    Microsoft Visual Studio 2008</p>
<p>   <a href="/attachments/month_0803/k200832916121.rar" target="_blank">点击下载此文件</a></p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-4-plug-ins-and-source-code-download-demo-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (三) Demo</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-3-demo-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-3-demo-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 07:58:23 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[示例]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=189</guid>
		<description><![CDATA[下面来演示一下Plugins Manager，先看看我们事先做好的Interface和两个具体实现的插件. Interface，接口定义： [code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Component { public interface IComponent { string Invoke(); } } [/code] 整个接口，只声明了一个Invoke方法，这也是具体的插件必须实现的一个方法。 第一个插件类 class1.cs [code] namespace Component { public class Class1 : MarshalByRefObject,IComponent { string message = string.Empty; int number; float number2; public Class1(string input, int num) { message = input; number [...]]]></description>
			<content:encoded><![CDATA[<p>下面来演示一下Plugins Manager，先看看我们事先做好的Interface和两个具体实现的插件.</p>
<p>   Interface，接口定义：<br />
  [code]<br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;</p>
<p>namespace Component<br />
{<br />
    public interface IComponent<br />
    {<br />
        string Invoke();<br />
    }<br />
}<br />
   [/code]</p>
<p>    整个接口，只声明了一个Invoke方法，这也是具体的插件必须实现的一个方法。</p>
<p>   第一个插件类 class1.cs<br />
    [code]<br />
    namespace Component<br />
{</p>
<p>    public class Class1 : MarshalByRefObject,IComponent<br />
    {<br />
        string message = string.Empty;<br />
        int number;<br />
        float number2;</p>
<p>        public Class1(string input, int num)<br />
        {<br />
            message = input;<br />
            number = num;<br />
            number2 = 0;<br />
        }</p>
<p>        public Class1(int num1, float num2)<br />
        {<br />
            message = "none";<br />
            number = num1;<br />
            number2 = num2;<br />
        }</p>
<p>        public string Invoke()<br />
        {<br />
            return "This is TestLibrary. member---message:" + message + "number:" + number.ToString() + "number2:" +number2.ToString();<br />
        }<br />
    }<br />
}</p>
<p>    [/code]</p>
<p>    第二个插件类 class2.cs<br />
    [code]<br />
namespace Component<br />
{<br />
    public class Class2 : MarshalByRefObject,IComponent<br />
    {<br />
        public Class2()<br />
        {<br />
        }</p>
<p>        public string Invoke()<br />
        {<br />
            return "This is TestLibrary2 without construct param";<br />
        }<br />
    }<br />
}</p>
<p>    [/code]</p>
<p>    这里我们看到区别，第一个插件，需要构造函数，第二个插件不需要构造函数，所以在配置文件中，第二个插件可以关闭掉ConstructParam这个节点。</p>
<p>   下面我们将Class1.cs编译好，放到插件目录中，改名为TestLibrary.dll，将Class2.cs直接改名为TestLibrary2.cs，放到插件目录中。<br />
   演示的目的：插件1需要在加载时，构造初始化函数，而插件2不需要。<br />
               插件1，是已经编译好的dll，不需要实时编译，但是插件2需要。</p>
<p>   下面是测试的截图</p>
<p>   1.插件目录，一个放入编译好的dll，一个放入.cs源码</p>
<p><img src="/pics/PluginManager/demo1.jpg" border="0" alt=""/></p>
<p>     2.启动测试程序，看到2个插件都已经被加载</p>
<p><img src="/pics/PluginManager/demo2.jpg" border="0" alt=""/></p>
<p>     3.此时，再查看插件的目录，我们会看到Plugin Manager为我们编译，并生成的插件2的dll</p>
<p><img src="/pics/PluginManager/demo3.jpg" border="0" alt=""/></p>
<p>   4.查看插件的日志记录</p>
<p><img src="/pics/PluginManager/demo4.jpg" border="0" alt=""/></p>
<p>   5.插件的调用<br />
   选中TestLibrary,点击Invoke按钮：</p>
<p><img src="/pics/PluginManager/demo5.jpg" border="0" alt=""/></p>
<p>  选中TestLibrary2,点击Invoke按钮：</p>
<p><img src="/pics/PluginManager/demo6.jpg" border="0" alt=""/></p>
<p>   6.插件的动态卸载和发布<br />
     a.动态卸载，可以直接使用Plugins Manager的UnloadPluginByName直接通过程序调用卸载。也可以手动打开插件的配置文件，将EnablePlugin设置为False<br />
       b.动态发布，直接在插件目录中，建立一个新的子目录，然后将插件的dll和xml配置文件直接拷入即可<br />
     关于第6点，这些功能的演示，截图比较麻烦，大家可以直接使用测试程序测试即可。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-3-demo-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (二) 配置及实现分析</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2-configuration-and-implementation-of-analysis-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2-configuration-and-implementation-of-analysis-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 07:24:58 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[分析]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[实现]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[管理器]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=188</guid>
		<description><![CDATA[整个Plugins Manager是一个基于dll的程序集，开发平台，基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢？没别的原因，只要是为了尝试一下Linq to XML [cool] 使用改组件，需要在应用程序中，添加引用。另外，还需要在应用程序中，建立相关的配置项： [code] [/code] PluginsPath是插件的主目录，里面通过子目录的方式，存放不同的插件。Plugins Manager在启动的时候，会遍历插件主目录，并搜寻可加载的插件。 LogPath是插件的日志目录，里面的日志文件，会详细记载插件管理器当前的运行情况。 另外，在Plugins Manager中，区别不同的插件，是根据不同的插件名称来决定的，这取决于插件dll的命名。 对于不同的插件，Plugins Manager也提供不同的特性配置文件。配置文件是.xml文件，命名需要和插件dll相一致。 下面是一个配置文件的示例： [code] Component.Class1 True D:\MyCode\C# Projects\DynamicPlugInsApp\ITestInterface\bin\Debug\ITestInterface.dll [/code] TypeName:插件的类名，和具体的插件命名空间和类名有关，Plugins Manager根据配置文件提供此相关信息，通过.NET的反射技术，生成具体的插件Instance EnablePlugin:插件开关，True表示当前插件可用，False表示阻止Plugins Manager加载此插件。该开关可以在Plugins Manager运行前设定，也可以在Plugins Manager运行时动态更改。Plugins Manager会检测配置文件变化，并留意EnablePlugin开关，以决定是否动态加载或者卸载该插件。 ConstructParams:此节点，及其子节点，用以读取插件是否需要在运行时初始化构造函数。子节点用以描述构造函数中的参数，以及类型，和初始化的值。构造初始化函数，也是在.NET的反射中实现。这里要注意，节点顺序和构造函数参数顺序有关。如果插件不需要构造函数，可以关闭此节点。 ReferenceList:此节点用以需要动态编译的插件，如果插件代码中还引用了其他的程序集，需要在此进行描述。 此外，插件还提供了事件通知功能，供应用程序进行响应和处理，实现的事件类型有以下几种： [code] public enum PluginEventType { PluginLoadOver, //所有插件加载完毕 PluginAdded, //插件新增完毕 PluginRemoved, //插件卸载完毕 PluginStopped, //插件管理器已停止 PluginStarted //插件管理器已启动 } [/code] 插件的事件参数定义如下，只包含简单的事件类型和文本描述： [code] public [...]]]></description>
			<content:encoded><![CDATA[<p>整个Plugins Manager是一个基于dll的程序集，开发平台，基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢？没别的原因，只要是为了尝试一下Linq to XML [cool]</p>
<p>    使用改组件，需要在应用程序中，添加引用。另外，还需要在应用程序中，建立相关的配置项：<br />
[code]<br />
<?xml version="1.0" encoding="utf-8" ?><br />
<configuration><br />
  <appSettings><br />
    <add key="PluginsPath" value="D:\MyCode\C# Projects\DynamicPlugInsApp\DynamicPlugInsApp\bin\Debug\Plugins"/><br />
    <add key="LogPath" value="D:\MyCode\C# Projects\DynamicPlugInsApp\DynamicPlugInsApp\bin\Debug\Log"/><br />
  </appSettings><br />
</configuration><br />
[/code]</p>
<p>    PluginsPath是插件的主目录，里面通过子目录的方式，存放不同的插件。Plugins Manager在启动的时候，会遍历插件主目录，并搜寻可加载的插件。<br />
   LogPath是插件的日志目录，里面的日志文件，会详细记载插件管理器当前的运行情况。</p>
<p>   另外，在Plugins Manager中，区别不同的插件，是根据不同的插件名称来决定的，这取决于插件dll的命名。<br />
   对于不同的插件，Plugins Manager也提供不同的特性配置文件。配置文件是.xml文件，命名需要和插件dll相一致。<br />
   下面是一个配置文件的示例：<br />
[code]<br />
<?xml version="1.0" encoding="utf-8" ?></p>
<plugin>
  <typeName>Component.Class1</typeName><br />
  <enablePlugin>True</enablePlugin><br />
  <constructParams></p>
<param type="string" value="msadc" />
<param type="int" value="12" />
  </constructParams><br />
  <referenceList><br />
   <reference>D:\MyCode\C# Projects\DynamicPlugInsApp\ITestInterface\bin\Debug\ITestInterface.dll</reference><br />
  </referenceList>
</plugin>
[/code]</p>
<p>   TypeName:插件的类名，和具体的插件命名空间和类名有关，Plugins Manager根据配置文件提供此相关信息，通过.NET的反射技术，生成具体的插件Instance<br />
   EnablePlugin:插件开关，True表示当前插件可用，False表示阻止Plugins Manager加载此插件。该开关可以在Plugins Manager运行前设定，也可以在Plugins Manager运行时动态更改。Plugins Manager会检测配置文件变化，并留意EnablePlugin开关，以决定是否动态加载或者卸载该插件。<br />
  ConstructParams:此节点，及其子节点，用以读取插件是否需要在运行时初始化构造函数。子节点用以描述构造函数中的参数，以及类型，和初始化的值。构造初始化函数，也是在.NET的反射中实现。<span style="color:Red">这里要注意，节点顺序和构造函数参数顺序有关</span>。如果插件不需要构造函数，可以关闭此节点。<br />
  ReferenceList:此节点用以需要动态编译的插件，如果插件代码中还引用了其他的程序集，需要在此进行描述。</p>
<p>  此外，插件还提供了事件通知功能，供应用程序进行响应和处理，实现的事件类型有以下几种：</p>
<p>  [code]<br />
    public enum PluginEventType<br />
    {<br />
        PluginLoadOver, //所有插件加载完毕<br />
        PluginAdded,      //插件新增完毕<br />
        PluginRemoved,  //插件卸载完毕<br />
        PluginStopped,   //插件管理器已停止<br />
        PluginStarted     //插件管理器已启动<br />
    }<br />
   [/code]</p>
<p>   插件的事件参数定义如下，只包含简单的事件类型和文本描述：</p>
<p>    [code]<br />
    public class PluginEventArgs : EventArgs<br />
    {<br />
        #region Private Members<br />
        public PluginEventType EventType { get; set; }<br />
        public string EventMessage { get; set; }<br />
        #endregion</p>
<p>        public PluginEventArgs(PluginEventType eventtype, string message)<br />
        {<br />
            EventType = eventtype;<br />
            EventMessage = message;<br />
        }</p>
<p>    }<br />
   [/code]</p>
<p>   以上是使用该插件，需要配置的地方，下一篇日志，将演示该插件的Demo.</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2-configuration-and-implementation-of-analysis-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (一) 介绍</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-1-introduction-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-1-introduction-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 06:55:32 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[介绍]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=187</guid>
		<description><![CDATA[Dynamic Plugins Manager是一个基于.NET的动态插件管理组件，也是我在业余时间做的一个小东东，代码在07年底就开始动工，因为一直没充裕时间完成，趁这个周末休息，加班加点的Coding，出来了一个原型，估计里面还有很多的显而易见的以及隐而未现的bug。 设计这个组件的初衷，是为了能方便的应用于今后的项目中。先进的企业级项目中，变化最为突出的，还是业务，业务的变化，直接导致编码中业务逻辑代码的变化。如果将这些业务逻辑混杂在一起，业务的变化，最终会导致代码的混乱，甚至难以维护。这对于一个长期迭代的项目来说，是相当痛苦的事。就像直接拿一个成千上万行的代码给开发人员，估计开发人员不是晕厥，就是吐血。而一个难以维护的业务逻辑代码，对于每一次迭代，都是一次冒险。很可能在某次的迭代中，会对以前的业务逻辑，产生影响或者风险。 对于复杂的业务逻辑，需要进行重构，并且将不断变化的业务逻辑，抽离出来。比较折中的方法，就是将这些变化的逻辑，做成独立的插件形式。这样一来，独立的业务，在物理上进行了分离。开发人员也不用担心修改某处业务逻辑，会影响其他的业务模块。而动态的插件管理形式，对后期维护也带来益处，独立的业务逻辑插件之间，不会相互影响。开发人员还可以在程序运行而又不影响业务的情况下，动态的发布、替换原有的业务逻辑模块。 Dynamic Plugins Manager(以下简称Plugins Manager)，也就是按照这样的思路和需求来设计的，其实现的功能，具体有一下几个特点： 1.所有的插件，都以DLL程序集的方式发布,Plugins Manager在启动的时候，搜索加载所有可加载的插件并进行加载 2.Plugins Manager，支持插件的动态卸载功能。借助于AppDomain的特性，所有的组件，在动态加载后，可以动态从内存中卸载。插件的实现，需要继承自MarshalByRefObject。 3.与接口无依赖性，Plugins Manager负责插件的管理、动态加载、动态卸载、调用。但是和具体的插件接口无关，这样一来，开发人员可以定义自己的插件接口，并开发不同的插件实现接口。 4.插件可以动态发布和卸载,Plugins Manager会监视当前目录中，插件的变化，对于以xcopy方式，拷贝入插件目录的插件，可以进行动态加载。对于插件的卸载，可以Plugins Manager提供的接口进行动态卸载，也可以实时更改插件配置文件中的具体开关进行卸载。 5.动态编译功能：Plugins Manager允许直接发布插件代码。通过读取插件配置文件中的引用信息，可以直接从代码生成dll插件，并加载。 6.允许插件实现不同的构造函数重载，并将构造函数参数以及值信息，定义在插件配置文件中。Plugins Manager在加载插件的时候，采用配置文件中的值，调用相应的构造函数，并加载插件。 7.事件通知：Plugins Manager在不同的插件操作完成后，会触发相应的事件机制，通知客户端程序进行相应的处理 插件的结构一览： PluginsManager:插件管理类，实现插件功能的主要代码逻辑，以及对插件容器的维护 AssemblyLoader:插件加载类，实现从AppDomain加载插件的逻辑 PluginEntity:插件实体类，包含插件的信息(插件实例、插件名称……) AssemblyFactory:插件生成类，实现从插件代码生成dll的功能 下一篇日志中，将会介绍这个插件的具体配置，及简单分析其实现。 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>Dynamic Plugins Manager是一个基于.NET的动态插件管理组件，也是我在业余时间做的一个小东东，代码在07年底就开始动工，因为一直没充裕时间完成，趁这个周末休息，加班加点的Coding，出来了一个原型，估计里面还有很多的显而易见的以及隐而未现的bug。<br />
  设计这个组件的初衷，是为了能方便的应用于今后的项目中。先进的企业级项目中，变化最为突出的，还是业务，业务的变化，直接导致编码中业务逻辑代码的变化。如果将这些业务逻辑混杂在一起，业务的变化，最终会导致代码的混乱，甚至难以维护。这对于一个长期迭代的项目来说，是相当痛苦的事。就像直接拿一个成千上万行的代码给开发人员，估计开发人员不是晕厥，就是吐血。而一个难以维护的业务逻辑代码，对于每一次迭代，都是一次冒险。很可能在某次的迭代中，会对以前的业务逻辑，产生影响或者风险。<br />
  对于复杂的业务逻辑，需要进行重构，并且将不断变化的业务逻辑，抽离出来。比较折中的方法，就是将这些变化的逻辑，做成独立的插件形式。这样一来，独立的业务，在物理上进行了分离。开发人员也不用担心修改某处业务逻辑，会影响其他的业务模块。而动态的插件管理形式，对后期维护也带来益处，独立的业务逻辑插件之间，不会相互影响。开发人员还可以在程序运行而又不影响业务的情况下，动态的发布、替换原有的业务逻辑模块。<br />
  Dynamic Plugins Manager(以下简称Plugins Manager)，也就是按照这样的思路和需求来设计的，其实现的功能，具体有一下几个特点：<br />
  1.所有的插件，都以DLL程序集的方式发布,Plugins Manager在启动的时候，搜索加载所有可加载的插件并进行加载<br />
  2.Plugins Manager，支持插件的动态卸载功能。借助于AppDomain的特性，所有的组件，在动态加载后，可以动态从内存中卸载。插件的实现，需要继承自MarshalByRefObject。<br />
  3.与接口无依赖性，Plugins Manager负责插件的管理、动态加载、动态卸载、调用。但是和具体的插件接口无关，这样一来，开发人员可以定义自己的插件接口，并开发不同的插件实现接口。<br />
  4.插件可以动态发布和卸载,Plugins Manager会监视当前目录中，插件的变化，对于以xcopy方式，拷贝入插件目录的插件，可以进行动态加载。对于插件的卸载，可以Plugins Manager提供的接口进行动态卸载，也可以实时更改插件配置文件中的具体开关进行卸载。<br />
  5.动态编译功能：Plugins Manager允许直接发布插件代码。通过读取插件配置文件中的引用信息，可以直接从代码生成dll插件，并加载。<br />
  6.允许插件实现不同的构造函数重载，并将构造函数参数以及值信息，定义在插件配置文件中。Plugins Manager在加载插件的时候，采用配置文件中的值，调用相应的构造函数，并加载插件。<br />
  7.事件通知：Plugins Manager在不同的插件操作完成后，会触发相应的事件机制，通知客户端程序进行相应的处理</p>
<p>  插件的结构一览：</p>
<p><img src="/pics/PluginManager/PluginManager.jpg" border="0" alt=""/></p>
<p>   PluginsManager:插件管理类，实现插件功能的主要代码逻辑，以及对插件容器的维护<br />
   AssemblyLoader:插件加载类，实现从AppDomain加载插件的逻辑<br />
   PluginEntity:插件实体类，包含插件的信息(插件实例、插件名称……)<br />
   AssemblyFactory:插件生成类，实现从插件代码生成dll的功能</p>
<p>  下一篇日志中，将会介绍这个插件的具体配置，及简单分析其实现。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-1-introduction-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 06:47:15 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=186</guid>
		<description><![CDATA[Dynamic Plugins Manager (一) 介绍 http://www.xiaozhou.net/article.asp?id=187 Dynamic Plugins Manager (二) 配置及实现分析 http://www.xiaozhou.net/article.asp?id=188 Dynamic Plugins Manager (三) Demo http://www.xiaozhou.net/article.asp?id=189 Dynamic Plugins Manager (四) 插件及Demo源码下载 http://www.xiaozhou.net/article.asp?id=190 Dynamic Plugins Manager (五) Plugins Manager 源码下载 http://www.xiaozhou.net/article.asp?id=191 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>Dynamic Plugins Manager (一) 介绍</p>
<p>http://www.xiaozhou.net/article.asp?id=187</p>
<p>Dynamic Plugins Manager (二) 配置及实现分析</p>
<p>http://www.xiaozhou.net/article.asp?id=188</p>
<p>Dynamic Plugins Manager (三) Demo</p>
<p>http://www.xiaozhou.net/article.asp?id=189</p>
<p>Dynamic Plugins Manager (四) 插件及Demo源码下载</p>
<p>http://www.xiaozhou.net/article.asp?id=190</p>
<p>Dynamic Plugins Manager (五) Plugins Manager 源码下载</p>
<p>http://www.xiaozhou.net/article.asp?id=191</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

