<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_空逸云</title><subtitle type="text">路漫漫其修远兮,吾将上下而求索.</subtitle><id>http://feed.cnblogs.com/blog/u/60942/rss</id><updated>2012-02-06T14:46:21Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/60942/rss"/><entry><id>http://www.cnblogs.com/kongyiyun/archive/2012/02/03/2336511.html</id><title type="text">计算一个数字有多少种排列可能</title><summary type="text">现有一数字，例如12345，问这个数字有多少种排列可能，最简单的就是位数的阶乘，5位数字等于5*4*3*2*1=120,这是理论上没有重复数字的情况下，如果现在是11234，11123，11112，11223有重复数字组成的数字怎么计算呢？ 若一个数字由所有不相同的数字组成，则该数字的排列可能是该数组位数的阶乘，若该数字中存在重复的数字，例如，有m个1相同，结果就是n! / m!,n值是数...</summary><published>2012-02-03T01:14:00Z</published><updated>2012-02-03T01:14:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2012/02/03/2336511.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2012/02/03/2336511.html"/><content type="html">&lt;p&gt;现有一数字，例如12345，问这个数字有多少种排列可能，最简单的就是位数的阶乘，5位数字等于5*4*3*2*1=120,这是理论上没有重复数字的情况下，如果现在是11234，11123，11112，11223有重复数字组成的数字怎么计算呢？&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;若一个数字由所有不相同的数字组成，则该数字的排列可能是该数组位数的阶乘，若该数字中存在重复的数字，例如，有m个1相同，结果就是n! / m!,n值是数字的位数，如果还存在p个相同的数字，那结果就是n! / m! /p!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;根据上面的算法，上面的数字计算如下：&lt;/p&gt;  &lt;p&gt;11234=5！ / 2！=60&lt;/p&gt;  &lt;p&gt;11123=5! / 3!=20&lt;/p&gt;  &lt;p&gt;11112=5! / 4! = 4&lt;/p&gt;  &lt;p&gt;11223=5! / 2! / 2! = 30&lt;/p&gt;  &lt;p&gt;附上C#实现&lt;/p&gt;  &lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;MathHelper&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;输入一个数字，算出该数值有多少种排列可能.&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name=&amp;quot;num&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #99a38a"&gt;The num.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public static long &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CountPermutation(&lt;/span&gt;&lt;span style="color: #93c763"&gt;long &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;number &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #8c8cb4"&gt;IDictionary&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;char&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;rptNum &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Dictionary&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;char&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;char &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ch &lt;/span&gt;&lt;span style="color: #93c763"&gt;in &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;number)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(rptNum&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Keys&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Where(it &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;it &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ch)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Count() &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;                rptNum[ch] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+= &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;else&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;rptNum&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Add(ch, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;long &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;totalFac &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Factorial(number&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;item &lt;/span&gt;&lt;span style="color: #93c763"&gt;in &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;rptNum&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Where(it &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;it&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Value &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;))&lt;br/&gt;        {&lt;br/&gt;            totalFac &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;/= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Factorial(item&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Value);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;totalFac;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;计算阶乘.&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name=&amp;quot;num&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #99a38a"&gt;The num.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public static long &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Factorial(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(num &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;* &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Factorial(&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;--&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num);&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;输出数字的全排列&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面计算出了一个数字有多少种排列可能，下面就要分别列出这些排列结果！网上已经有了很多的算法，最基础的还是迭代循环，但数字一大效率是一个问题，另外一点就是无法去除重复数字，例如计算1123，1122这样数字的全排列结果的时候，本人数学不太好，索性，在博客园找到一个同学的实现：  &lt;br clear="all" /&gt;&lt;a href="http://www.cnblogs.com/altitude/archive/2011/04/16/2243512.html"&gt;一组数字的全排列按序输出&lt;/a&gt;  &lt;br clear="all" /&gt;&lt;a href="http://www.cnblogs.com/grenet/archive/2011/04/29/2032812.html"&gt;再议“生成全排列算法”&lt;/a&gt;&lt;/p&gt;&lt;p&gt;通过第一个同学的思路和实现，完成了一个C#版本，对于低数位的数字来说效率还是挺不错的，性能方面的测试我就先偷个懒，目前先应用上就行，毕竟目前这个实现已经满足我的需求了，呵呵！&lt;/p&gt;&lt;p&gt;C#实现&lt;/p&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;/// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;全排列算法类&lt;br/&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FullArrangementHelper&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;private int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_length;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #8c8cb4"&gt;IList&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;long&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Result { &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #93c763"&gt;private set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FullArrangementHelper()&lt;br/&gt;    {&lt;br/&gt;        Result &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;List&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;long&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #8c8cb4"&gt;IList&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;long&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetFullArrangement(&lt;/span&gt;&lt;span style="color: #93c763"&gt;long &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;numStr &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;num&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] nums &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[numStr&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length];&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;for &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;numStr&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length; i&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;++&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;            nums[i] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Parse(numStr[i]&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString());&lt;br/&gt;        _length &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;nums&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length;&lt;br/&gt;&lt;br/&gt;        nums &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;nums&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;OrderBy(it &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;it)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToArray&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;/span&gt;&lt;span style="color: #66747b"&gt;//排序&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FullArrangement(nums, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Result;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;计算全排列算法&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name=&amp;quot;nums&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #99a38a"&gt;要计算全排列的数字.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name=&amp;quot;pos&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #99a38a"&gt;开始计算排列的位置，例如，现在的数字是1234，如果pos为0，就代表计算这四位的全排列，1的下标为0，&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;如果为1，则计算后3位的全排列，依次下推.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FullArrangement(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] nums, &lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;pos)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #66747b"&gt;//将现在的数字添加到结果中&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Result&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Add(ConvertToNum(nums));&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #66747b"&gt;//最大是数字的长度-2是因为按照下标计算，此处pos-1是因为后续的步骤中需要+1来对相邻的两个数字做比较&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;for &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_length &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;pos &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; i&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;--&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;            NextArrangement(nums, i);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;计算下一轮全排列&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name=&amp;quot;nums&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #99a38a"&gt;数字的分解数组.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name=&amp;quot;pos&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #99a38a"&gt;开始计算排列的位置.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;NextArrangement(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] nums, &lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;pos)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] cop &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[_length];&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #66747b"&gt;//根据下标依次计算数字的全排列，实际就是大排列都由小排列一步步扩大&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;for &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;pos &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_length; i&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;++&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(nums[i] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;nums[pos] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;nums[i] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;nums[i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;])&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;for &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;t &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; t &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_length; t&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;++&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;                    cop[t] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;nums[t];&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #66747b"&gt;//交换数字位&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;for &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;j &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;i; j &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;pos; j&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;--&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #93c763"&gt;int &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;temp &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;cop[j];&lt;br/&gt;                    cop[j] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;cop[j &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;];&lt;br/&gt;                    cop[j &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;temp;&lt;br/&gt;                }&lt;br/&gt;                FullArrangement(cop, pos &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;private long &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ConvertToNum(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] nums)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;StringBuilder &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;sb &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;StringBuilder&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;n &lt;/span&gt;&lt;span style="color: #93c763"&gt;in &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;nums)&lt;br/&gt;            sb&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Append(n);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;return long&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Parse(sb&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString());&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2336511.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2012/02/03/2336511.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2012/01/08/2316345.html</id><title type="text">跟我做WinForm开发（2）-后台逻辑操作</title><summary type="text">上一篇中，我简单了介绍了实现自定义UI的步骤和其中一些需要注意的点；详见：跟我做WinForm开发（1）-自定义UI，下面，我就继续完成上篇没完成的逻辑操作； 获取声音 这是一个发音器，声音的来源是Google，打开Google翻译,输入一段英文，并点击发音，Google很快就读取了我所输入的句子，打开HttpWatch，发现，实际上每次发音，都会把输入的句子做一次UrlEncode，然后发往...</summary><published>2012-01-08T04:32:00Z</published><updated>2012-01-08T04:32:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2012/01/08/2316345.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2012/01/08/2316345.html"/><content type="html">&lt;p&gt;上一篇中，我简单了介绍了实现自定义UI的步骤和其中一些需要注意的点；详见：&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2012/01/07/2315636.html"&gt;跟我做WinForm开发（1）-自定义UI&lt;/a&gt;，下面，我就继续完成上篇没完成的逻辑操作；&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;获取声音&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;这是一个发音器，声音的来源是Google，打开&lt;a href="http://translate.google.cn/?hl=en" target="_blank"&gt;Google翻译&lt;/a&gt;,输入一段英文，并点击发音，Google很快就读取了我所输入的句子，打开HttpWatch，发现，实际上每次发音，都会把输入的句子做一次UrlEncode，然后发往Google服务器，最后返回一个Mp3的流；这个URL如下&lt;a title="http://translate.google.cn/translate_tts?ie=UTF-8&amp;amp;q=hello%20world%2C2012&amp;amp;tl=en&amp;amp;prev=input" href="http://translate.google.cn/translate_tts?ie=UTF-8&amp;amp;q=hello%20world%2C2012&amp;amp;tl=en&amp;amp;prev=input"&gt;http://translate.google.cn/translate_tts?ie=UTF-8&amp;amp;q=hello%20world%2C2012&amp;amp;tl=en&amp;amp;prev=input&lt;/a&gt;；从上面我们应该可以看到去参数就是你要发音的内容，而tl就是该语言的简写；那么我们需要做的，就是修改q获得我们想要的MP3流；PS：在后面的尝试当中，我发现Google做了限制，只允许长度为100；超出100则无返回结果，这个100是Length；而不是所占字节长度，所以，中文在这里更占优势；&lt;/p&gt;  &lt;p&gt;好了；既然目标已确定，那就开始吧；那有什么办法能让我拿到这个MP3流呢？答案不言而喻，就是HttpWebRequest；在这里，我新建了一个叫HttpHelper的类，它主要用于做简单的Http Get请求；&lt;/p&gt;  &lt;span style="background: #22282a; color: #93c763"&gt;internal static class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpHelper&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// &lt;/span&gt;&lt;span style="background: #22282a; color: #99a38a"&gt;发起请求，用于GET.&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name=&amp;quot;url&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #99a38a"&gt;The URL.&lt;/span&gt;&lt;span style="background: #22282a; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;internal static void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;SendRequest(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;url, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WebRequestCallBack &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;callBack)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Log&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Info(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;Send Request&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;try&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpWebRequest &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;request &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpWebRequest&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpWebRequest&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Create(url);&lt;br/&gt;            request&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;KeepAlive &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;false&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;            request&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Method &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CallbackParam &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;cp &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CallbackParam&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;                Request &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;request,&lt;br/&gt;                CallBack &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;callBack&lt;br/&gt;            };&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Log&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Info(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;Begin get Responsen.&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;            request&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BeginGetResponse(BeginGetResponse, cp);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;catch &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Exception &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ex)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Log&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Info(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;Error:&amp;quot; &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ex&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Message);&lt;br/&gt;            callBack(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Continue, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WebExceptionStatus&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;UnknownError, ex);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BeginGetResponse(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;IAsyncResult &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ar)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Log&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Info(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;Get Response&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CallbackParam &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;cp &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ar&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;AsyncState &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;as &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CallbackParam&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;try&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;using &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpWebResponse &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;response &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpWebResponse&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)cp&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Request&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;EndGetResponse(ar))&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;using &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;responseStream &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;response&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResponseStream())&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;MemoryStream &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ms &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;MemoryStream&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;();&lt;br/&gt;                    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;byte&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;[] buffer &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new byte&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;[&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1024&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;];&lt;br/&gt;                    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;byteReader;&lt;br/&gt;                    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;do&lt;br/&gt;                    &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;                        byteReader &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;responseStream&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Read(buffer, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, buffer&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Length);&lt;br/&gt;                        ms&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Write(buffer, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, byteReader);&lt;br/&gt;                    }&lt;br/&gt;                    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;while &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(byteReader &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;&lt;br/&gt;                    ms&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Flush();&lt;br/&gt;                    cp&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;CallBack(ms, response&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;StatusCode, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WebExceptionStatus&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Success, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;catch &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WebException &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ex)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Log&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Info(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;Error:&amp;quot; &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ex&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Message);&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpWebResponse &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;response &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpWebResponse&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)ex&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Response;&lt;br/&gt;            cp&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;CallBack(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, response&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;StatusCode, ex&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Status, ex);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;catch &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Exception &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ex)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Log&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Info(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;Error:&amp;quot; &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ex&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Message);&lt;br/&gt;            cp&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;CallBack(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Continue, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WebExceptionStatus&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;UnknownError, ex);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;从上面的代码看到，首先，我创建了一个HttpWebRequest对象，并将其请求方法设置为GET；随后，开始了异步请求；当获取到&lt;/p&gt;&lt;p&gt;服务器响应的时候，便将相应流读出来，发送给回调方法，这里为什么要用异步？一个是避免主线程阻塞，导致UI挂起；另外就是这面编码看起来更有Feel吧! :-)~~&lt;/p&gt;&lt;p&gt;现在就可以直接获取MP3流了吧！等等；还不行！应为我们还没讲输入的字符串UrlEncode，那怎么办？写呗！&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;SpeakTextHandler&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetSpeakerUrl(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sourceText)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;config &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;ConfigManger&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetConfig();&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return string&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Format(config&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;SpeakerUrl, GetEncodeText(sourceText), GetTextLanguage(config, sourceText));&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private static string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetEncodeText(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;source)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;IsNullOrEmpty(source)) &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return string&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Empty;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HttpUtility&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;UrlPathEncode(source);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private static string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetTextLanguage(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Config &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;config, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;source)&lt;br/&gt;    {&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;language &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;in &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;config&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Languages)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Regex&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Match(source, language&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Unicode)&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Success)&lt;br/&gt;                &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;language&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Name;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;config&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DefaultLanguage&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Name;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;这里我创建了一个SpeakerTextHandler的类，它主要工作就是将传入的字符串UrlEncode，并获取配置，拼接出相应的Url；到这&lt;/p&gt;&lt;p&gt;里，获取声音就大功告成了！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;播放声音&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;拿到声音之后需要做什么？必然就是将其播放出来；由于没弄过这方面的东西（平时都是些Asp.net）；好吧，就Google吧；网上给出了好几个解决方案；&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;A:使用SoundPlayer;这个很明显就不行，有使用经验的童鞋应该知道，SoundPlayer只支持wav格式的播放，虽然它能支持传入Stream流参数，但若是传入MP3流，还是报异常；&lt;/p&gt;  &lt;p&gt;B：WindowsMediaPlay;但是这个必须是读取文件；先不说是否支持MP3，单单是每次都需要先把流存储到本地再读取；我这懒人就无法忍受了；&lt;/p&gt;  &lt;p&gt;C：利用DX库来操作；这个淡淡看解决方案就很复杂；虽然可控性可能比较强；但这复杂度。。懒人望而生畏！:-(&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;难道就没其他解决方案了吗？几经波折，终于在StackOverflow中找到了一个可行方案；&lt;/p&gt;&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/184683/play-audio-from-a-stream-using-c-sharp"&gt;Play Audio from a Stream using C#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;其中使用的是一个叫&lt;a href="http://naudio.codeplex.com/" target="_blank"&gt;NAudio&lt;/a&gt;的开源组件，那么，它的确是可以解决我现在的窘境；照着StackOverflow上的代码来写，的确是可以播放出软件了，但是随后关闭软件的时候，都会出现一个错误的断言，跟踪&lt;a href="http://naudio.codeplex.com/" target="_blank"&gt;NAudio&lt;/a&gt;的实现，发现是流没释放；囧；最终几次尝试；终于把这个错误断言去掉了；&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(stream &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ex &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;{&lt;br/&gt;    stream&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Position &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;mp3Reader &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Mp3FileReader&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(stream);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;pcmStream &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WaveFormatConversionStream&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;CreatePcmStream(mp3Reader);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;using &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WaveStream &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;blockAlignedStream &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;BlockAlignReductionStream&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(pcmStream))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;using &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WaveOut &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;waveOut &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WaveOut&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;WaveCallbackInfo&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;FunctionCallback()))&lt;br/&gt;        {&lt;br/&gt;            waveOut&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Init(blockAlignedStream);&lt;br/&gt;            waveOut&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;PlaybackStopped &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(sender, e) &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;                waveOut&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Stop();&lt;br/&gt;            };&lt;br/&gt;            waveOut&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Play();&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;while &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(waveOut&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;PlaybackState &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;PlaybackState&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Playing)&lt;br/&gt;            {&lt;br/&gt;                System&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Threading&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Thread&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Sleep(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;100&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;            }&lt;br/&gt;            waveOut&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Dispose();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;该实现在HttpHelper的回调当中（更多代码请看后面放出的下载）；&lt;/p&gt;&lt;p&gt;&lt;strong&gt;快捷键支持&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;除了仅仅能发音，那还需要支持快捷键放大/缩小；或者是快捷键发音等；那还等什么？Come On！实际上，对这方面有经验的同学应该就能很自然的想到利用的就是“钩子”，当然，这个钩子的概念和我们平时编写代码时所使用的钩子这个概念有所区别，例如，Asp.net中控件/Page中有很多事件，OnLoad，OnCompleted等等。我们写代码的时候也可能会写一些空实现，让子类来做实现；这就是编程概念上的“钩子”，而这里的“钩子”，是指在触发系统一些事件的时候，也把我们所依附上的方法也执行了；其中的实现主要还是依靠与Win32API；&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public delegate void &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HotkeyEventHandler&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hotKeyID);&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Hotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;: System&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Forms&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;IMessageFilter&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Hashtable &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keyIDs &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Hashtable&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;();&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;IntPtr &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hWnd;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public event &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HotkeyEventHandler &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;OnHotkey;&lt;br/&gt;&lt;br/&gt;    [&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;DllImport&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;user32.dll&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)]&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static extern &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;RegisterHotKey(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;IntPtr &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hWnd, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;id, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;fsModifiers, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;vk);&lt;br/&gt;&lt;br/&gt;    [&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;DllImport&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;user32.dll&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)]&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static extern &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;UnregisterHotKey(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;IntPtr &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hWnd, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;id);&lt;br/&gt;&lt;br/&gt;    [&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;DllImport&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)]&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static extern &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GlobalAddAtom(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;String &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;lpString);&lt;br/&gt;&lt;br/&gt;    [&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;DllImport&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #ec7600"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)]&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static extern &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GlobalDeleteAtom(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;nAtom);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Hotkey(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;IntPtr &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hWnd)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hWnd &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hWnd;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Application&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;AddMessageFilter(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public int &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;RegisterHotkey(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Keys &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Key, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;KeyFlags &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keyflags)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hotkeyid &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GlobalAddAtom(System&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Guid&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;NewGuid()&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ToString());&lt;br/&gt;        RegisterHotKey((&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;IntPtr&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)hWnd, hotkeyid, (&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)keyflags, (&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)Key);&lt;br/&gt;        keyIDs&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Add(hotkeyid, hotkeyid);&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)hotkeyid;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;UnregisterHotkeys()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Application&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;RemoveMessageFilter(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;key &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;in &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keyIDs&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Values)&lt;br/&gt;        {&lt;br/&gt;            UnregisterHotKey(hWnd, key);&lt;br/&gt;            GlobalDeleteAtom(key);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public bool &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;PreFilterMessage(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;ref &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;System&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Forms&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Message &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;m)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(m&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Msg &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x312&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(OnHotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32 &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;key &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;in &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keyIDs&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Values)&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;((&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;UInt32&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)m&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;WParam &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;key)&lt;br/&gt;                    {&lt;br/&gt;                        OnHotkey((&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)m&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;WParam);&lt;br/&gt;                        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return true&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return false&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Flags&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;]&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public enum &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;KeyFlags&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;    Alt &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;,&lt;br/&gt;    Ctrl &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x2&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;,&lt;br/&gt;    Shift &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x4&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;,&lt;br/&gt;    Win &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x8&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;调用方法很简单；&lt;/p&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Hotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Hotkey&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(handle);&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;speakHotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hotkey&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;RegisterHotkey(System&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Forms&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Keys&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Q, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;KeyFlags&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Ctrl);&lt;br/&gt;hotkey&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;OnHotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HotkeyEventHandler&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;speakHotkey)&lt;br/&gt;    {&lt;br/&gt;        SendCtrlC(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetForegroundWindow());&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Thread&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Sleep(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;500&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Speaker&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Speak(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Clipboard&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetText());&lt;br/&gt;    }&lt;br/&gt;});&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;屏幕取词&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;相信大部分同学都有使用过翻译软件，其中的屏幕取词不可谓不是一大杀器，如果你想翻译一个单词都必须要先复制，然后在打开翻译软件，粘贴，这样的话效率未免也太低了，对于用户体验也不好；于是，我便想着自己实现这方面的功能；Google许久，得出主要的实现方式如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://topic.csdn.net/t/20060128/18/4536896.html" target="_blank"&gt;[讨论]关于C#屏幕取词的技术实现&lt;/a&gt;   &lt;br /&gt;&lt;a href="http://topic.csdn.net/u/20090724/17/88dc00a8-5912-4e6a-bf6b-3d2a0942acf4.html?39558" target="_blank"&gt;200分求[C#屏幕取词]&lt;/a&gt;   &lt;br clear="all" /&gt;&lt;a href="http://www.cnblogs.com/qiubole/articles/977764.html" target="_blank"&gt;屏幕取词技术实现原理与关键源码&lt;/a&gt;   &lt;br clear="all" /&gt;&lt;a href="http://topic.csdn.net/u/20110922/13/e30aba00-cf2b-411a-8acb-74789e5cfbed.html" target="_blank"&gt;如何获取鼠标选中文本内容，请赐教&lt;/a&gt;   &lt;br clear="all" /&gt;&lt;a href="http://topic.csdn.net/u/20100524/21/4dea305a-2d21-4281-8b18-c9689fb7815d.html" target="_blank"&gt;C# 如何获取鼠标选中文本内容&lt;/a&gt;&lt;/p&gt;&lt;p&gt;其中可行的方法就是利用金山词霸的dll，可惜，最终尝试都失败了！不过，其中单选记事本，编辑器中的文字成功，但浏览器/其他软件读词失败；看来，屏幕取词，不涉及到底层，单单用C#来实现还是很有难度；那我就换个思路吧，也只能通过选中文字，按下快捷键，先复制到剪贴板中，再将其读取出来；经过几番努力，最后可行方案如下：&lt;/p&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HotKeyManager&lt;br/&gt; &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;     &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;RegistSelectedSectionHotKey(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;IntPtr &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;handle)&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Hotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Hotkey&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(handle);&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;speakHotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hotkey&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;RegisterHotkey(System&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Forms&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Keys&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Q, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;KeyFlags&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Ctrl);&lt;br/&gt;         hotkey&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;OnHotkey &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;HotkeyEventHandler&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt;&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;             &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;speakHotkey)&lt;br/&gt;             {&lt;br/&gt;                 SendCtrlC(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetForegroundWindow());&lt;br/&gt;                 &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Thread&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Sleep(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;500&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;                 &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Speaker&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Speak(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Clipboard&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetText());&lt;br/&gt;             }&lt;br/&gt;         });&lt;br/&gt;     }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;     &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private static void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;SendCtrlC(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;IntPtr &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;hWnd)&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;SetForegroundWindow(hWnd);&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keybd_event(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x11&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keybd_event(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;67&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keybd_event(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x11&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;         &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;keybd_event(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;67&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;     }&lt;br/&gt; }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;我新建了一个HotKeyManager的类，里面的RegistSelectedSectionHotKey方法注册了热键，事件先通过&lt;/p&gt;&lt;p&gt;Win32API发送复制指令，线程阻塞500毫秒（将文字复制到剪贴板中需要一定的延迟时间）；然后获取剪切板的文字就大功告成了！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;尾声&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;项目虽小，却多有趣味；其中更是应用到了一些我从来没接触过的东西；也学到了不少东西；故写下备忘；也给需要这方面资料的童鞋一个帮助；总是如此，写下来时总觉无什么可写；但其中的收获和感言却不少；只有亲自动手才能有所收获；以后还需多多写！多多益善～～&lt;/p&gt;&lt;p&gt;源码下载：&lt;a href="http://files.cnblogs.com/kongyiyun/Speaker.rar" target="_blank"&gt;Speaker.rar&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2316345.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2012/01/08/2316345.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2012/01/07/2315636.html</id><title type="text">跟我做WinForm开发（1）-自定义UI</title><summary type="text">前言 前阵子，学英文的时候听发音，意外之中发现Google的发音相比大部分TTS发音更准确，而且读句子也没有普通TTS那种一听就是机器人的声音，心血来潮，想利用Google发音做一个小软件，所以就有了本文。 这是最后的UI成品图，可以看到，没有了常见的按钮，也没有了常见的Title框，整个布局随心所欲，GDI+？No。下面，就带大家跟我一起来用最简单的方式开发你所期望的UI吧！ 自定义窗...</summary><published>2012-01-07T04:03:00Z</published><updated>2012-01-07T04:03:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2012/01/07/2315636.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2012/01/07/2315636.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;前阵子，学英文的时候听发音，意外之中发现Google的发音相比大部分TTS发音更准确，而且读句子也没有普通TTS那种一听就是机器人的声音，心血来潮，想利用Google发音做一个小软件，所以就有了本文。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202393731.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202442613.png" width="406" height="88" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这是最后的UI成品图，可以看到，没有了常见的按钮，也没有了常见的Title框，整个布局随心所欲，GDI+？No。下面，就带大家跟我一起来用最简单的方式开发你所期望的UI吧！&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;自定义窗体&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;WinForm开发中，我们都知道窗体和控件的作用，实际上，以上的UI实现也是通过自定义窗体和用户控件实现，那该如何做，才能让窗体变成我们所想要的样子呢？&lt;/p&gt;  &lt;p&gt;首先，新建一个窗体，在这里，我命名为MainForm.cs，打开我们就可以见到以往的样子：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202455023.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/20120107120246463.png" width="244" height="243" /&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202479874.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202476428.png" width="244" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;选中窗体，右键=》属性，将FormBorderStyle设置成None， 窗体就变成了右图所示；接着，我再将其拖拉成我需要的长度和宽度，此时若编译运行，会发现实际上什么都东西都看不到，这正是我们所需要的效果，接着，就防止我们想呈现的元素。接着，我将其拉成一个长方形，并在四周放4个PictureBox，正中间放一个Panel。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202481345.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202499053.png" width="436" height="98" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这里需要注意的就是4个PictureBox的宽度，长度和未知，实际上我也不是拖控件，而是通过修改控件是属性，这里就需要精确到像素，聪明的你应该想到它们就是4条边框线和中间的内容块了，在这里我推荐一个软件，MarkMan，传说中的标注神器，做UI方面，特别是开发人员，很有帮助。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071202547097.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201201/201201071203028812.png" width="315" height="270" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;在将所需的图片填充上去就可以了。&lt;/p&gt;  &lt;span style="background: #22282a; color: #93c763"&gt;private &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Image &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResourceImg(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;name)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Image&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;FromStream(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Assembly&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetExecutingAssembly()&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetManifestResourceStream(name));&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;InitFormStyle()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #66747b"&gt;//边框&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;borderImg &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResourceImg(&lt;/span&gt;&lt;span style="background: #22282a; color: #efc210"&gt;@&amp;quot;Speaker.Resource.Images.border.jpg&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Bitmap &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;borderMap &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Bitmap&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(borderImg);&lt;br/&gt;    borderMap&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;MakeTransparent(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Color&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;FromArgb(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;255&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;255&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;));&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;pb_borderLeft&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;borderMap;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;pb_borderRight&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;borderMap;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;pb_borderTop&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;borderMap;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;pb_borderBottom&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;borderMap;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #66747b"&gt;//主面板&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;mainImg &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResourceImg(&lt;/span&gt;&lt;span style="background: #22282a; color: #efc210"&gt;@&amp;quot;Speaker.Resource.Images.main.jpg&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;pl_main&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Bitmap&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(mainImg);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #66747b"&gt;//Logo&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;logoImg &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResourceImg(&lt;/span&gt;&lt;span style="background: #22282a; color: #efc210"&gt;@&amp;quot;Speaker.Resource.Images.logo.jpg&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;btn_setting&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;NormalImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Bitmap&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(logoImg);&lt;br/&gt;    btn_setting&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Reset();&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #66747b"&gt;//Speak Button&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;normalImg &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResourceImg(&lt;/span&gt;&lt;span style="background: #22282a; color: #efc210"&gt;@&amp;quot;Speaker.Resource.Images.button.png&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;moveImg &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResourceImg(&lt;/span&gt;&lt;span style="background: #22282a; color: #efc210"&gt;@&amp;quot;Speaker.Resource.Images.buttonMove.png&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;downImg &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;GetResourceImg(&lt;/span&gt;&lt;span style="background: #22282a; color: #efc210"&gt;@&amp;quot;Speaker.Resource.Images.buttonDown.png&amp;quot;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    btn_speak&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;NormalImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;normalImg;&lt;br/&gt;    btn_speak&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;MoveImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;moveImg;&lt;br/&gt;    btn_speak&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DownImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;downImg;&lt;br/&gt;    btn_speak&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Reset();&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;编译通过之后，边框雏形就出现了～:-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;自定义控件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;窗体我们已经有了，接下来就是里面一些控件的实现，这里，我主要用到了两个控件，ImageButton和LightTextBox，顾名思义，ImageButton就是一个图片按钮，但它还提供鼠标按下，悬移时的图片选择；LightTextBox是一个TextBox，鼠标悬移的时候，边框高亮；&lt;/p&gt;&lt;p&gt;&lt;strong&gt;LightTextBox&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;新建用户控件LightTextBox，选中控件，右键=》属性，将BorderStyle改为None，这样，控件也不可见了！拖出一个TextBox，并标注为MultiLine,至此，UI就这样了，接着是控件的绘制编码；&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;LightTextBox()&lt;br/&gt;{&lt;br/&gt;    SetStyle(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;ControlStyles&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;OptimizedDoubleBuffer &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;ControlStyles&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;AllPaintingInWmPaint, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;true&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    InitializeComponent();&lt;br/&gt;    BackColor &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Color&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Transparent;&lt;br/&gt;    &lt;br/&gt;    txt&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Location &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Point&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;3&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;6&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    txt&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;MouseEnter &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(txt_MouseEnter);&lt;br/&gt;    txt&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;MouseLeave &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(txt_MouseLeave);&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;实现TextBox的鼠标悬移事件就是为了实现边框高亮效果；&lt;/p&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#region &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Events&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;txt_MouseLeave(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;EventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    _isFouse &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;false&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Invalidate();&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;txt_MouseEnter(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;EventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    _isFouse &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;true&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Invalidate();&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#endregion&lt;br/&gt;&lt;/span&gt;&lt;p&gt;方法部分（控件实现的主要方法）&lt;/p&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#region &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Methods&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;protected override void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;OnPaint(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;PaintEventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Graphics &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;g &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Graphics;&lt;br/&gt;    g&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;InterpolationMode &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;InterpolationMode&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;HighQualityBicubic;&lt;br/&gt;    g&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;SmoothingMode &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;SmoothingMode&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;HighQuality;&lt;br/&gt;&lt;br/&gt;    txt&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;-&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;6&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    CalculateSizeAndPosition();&lt;br/&gt;    Draw(e&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ClipRectangle, e&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Graphics);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;base&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;OnPaint(e);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;CalculateSizeAndPosition()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;txt&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Multiline)&lt;br/&gt;    {&lt;br/&gt;        Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;txt&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;9&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;else&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;        txt&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;9&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Draw(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Rectangle &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;rectangle, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Graphics &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;g)&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#region &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;画背景&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;using &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;SolidBrush &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;backgroundBrush &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;SolidBrush&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Color&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;White))&lt;br/&gt;    {&lt;br/&gt;        g&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;FillRectangle(backgroundBrush, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;4&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;4&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#endregion&lt;br/&gt;&lt;br/&gt;    #region &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;画阴影(外边框)&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Color &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;drawShadowColor &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;_shadowColor;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;_isFouse)    &lt;/span&gt;&lt;span style="background: #22282a; color: #66747b"&gt;//判断是否获得焦点&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;        drawShadowColor &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Color&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Transparent;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;using &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Pen &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;shadowPen &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Pen&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(drawShadowColor))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_radius &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;        {&lt;br/&gt;            g&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DrawRectangle(shadowPen, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;X, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Y, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;));&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;else&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;            g&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DrawPath(shadowPen, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;DrawHelper&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DrawRoundRect(rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;X, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Y, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, _radius));&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#endregion&lt;br/&gt;&lt;br/&gt;    #region &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;画边框&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;using &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Pen &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;borderPen &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Pen&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_borderColor))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_radius &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;        {&lt;br/&gt;            g&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DrawRectangle(borderPen, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;X &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Y &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;3&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;3&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;));&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;else&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;            g&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DrawPath(borderPen, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;DrawHelper&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;DrawRoundRect(rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;X &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Y &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;3&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, rectangle&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;- &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, _radius));&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#endregion&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#endregion&lt;br/&gt;&lt;/span&gt;&lt;p&gt;由于字段，属性比较多，我就不贴出来了，感兴趣的可以在后续的源码中查看；此时，若将该控件放到窗体中，鼠标移&lt;/p&gt;&lt;p&gt;动上去，则可发现边框有一层光晕；&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ImageButton&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里的自定义控件实现方式一致，都先去掉了BorderStyle，再自己控制呈现内容，所以才能达到显示特殊UI的目的；ImageButton的UI设计就不详述了，直接放出后台实现主代码；&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ImageButton()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;SetStyle(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;ControlStyles&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;AllPaintingInWmPaint &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;ControlStyles&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;OptimizedDoubleBuffer, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;true&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    InitializeComponent();&lt;br/&gt;    Reset();&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#region &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Methods&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Reset()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_normalImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;_normalImage;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Size &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Size&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_normalImage&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Width, _normalImage&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Height);&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;MakeTransparent(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Image &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;image)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Bitmap &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;bitmap &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;image &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;as &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Bitmap&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    bitmap&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;MakeTransparent(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Color&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;FromArgb(&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;255&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;255&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;));&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #a082bd"&gt;#endregion&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ImageButton_MouseEnter(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;EventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_moveImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;_moveImage;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ImageButton_MouseLeave(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;EventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;_normalImage;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ImageButton_MouseDown(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;MouseEventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_downImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;_downImage;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ImageButton_MouseUp(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;MouseEventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(_moveImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;null&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;BackgroundImage &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;_moveImage;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;MainForm&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;万事俱备，只欠东风；把控件都放入MainForm中，并初始其状态即可（上面第一部分代码已放出）；此时，编译运行；已达到我们预期的UI效果；但是，UI效果是有了，移动效果，缩小（点击任务栏图标）等却都失效了，该怎么办？Win32API千呼万唤使出来～&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;pl_main_MouseDown(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;MouseEventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(e&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Button &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;MouseButtons&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Left)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;ReleaseCapture();&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Win32&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;SendMessage(Handle, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;274&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;61440 &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;9&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;);&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;这里实际上是调用了Win32API，在这里，又有一个好东西分享；平时做这些Win32API交互/C#与C++交互，需&lt;/p&gt;&lt;p&gt;要做类型转换，特别是C++里面一些指针什么的，很是纠结，&lt;a href="http://clrinterop.codeplex.com"&gt;http://clrinterop.codeplex.com&lt;/a&gt;能帮到你；它能根据你输入的C++函数生成C#的代码；不可谓不是一大杀器啊！&lt;/p&gt;&lt;p&gt;移动解决了，那缩小的问题，也必须解决了；&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;protected override &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CreateParams &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;CreateParams&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;get&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;{&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;const int &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;WS_MINIMIZEBOX &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0x00020000&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;  &lt;/span&gt;&lt;span style="background: #22282a; color: #66747b"&gt;// Winuser.h中定义&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CreateParams &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;cp &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;base&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;CreateParams;&lt;br/&gt;        cp&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Style &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;cp&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Style &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;WS_MINIMIZEBOX;   &lt;/span&gt;&lt;span style="background: #22282a; color: #66747b"&gt;// 允许最小化操作  &lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;cp;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;重写CreateParams属性就可以了；到这里，我们的应用已经能正常显示出我们所想要的UI；但还不够，大部&lt;/p&gt;&lt;p&gt;分辅助类型的软件都有最小化的功能，那，我们也将其加上去吧；&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NotifyIcon&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个其实很简单，就是拖一个NotifyIcon到窗体中，并绑定一个ContextMenu到这个NotifyIcon中就可以了；然后在触发一些事件；&lt;/p&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private void &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;MainForm_Resize(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;object &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;sender, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;EventArgs &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;if &lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;(WindowState &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;FormWindowState&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Minimized)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;Visible &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;false&lt;/span&gt;&lt;span style="background: #22282a; color: #f1f2f3"&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;后面，我还主要用NotifyIcon来通知用户，做提示，错误提示等；到这里，整个UI方面就已经完成了；只&lt;/p&gt;&lt;p&gt;剩下后面的逻辑处理，就是输入句子能发音，并且支持快捷键屏幕取词等；&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更多资料&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/qianlifeng/archive/2010/04/13/1710862.html" target="_blank"&gt;跟我学做c#皮肤美化&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://pinvoke.net/index.aspx" target="_blank"&gt;WinAPI使用大全&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2012/01/08/2316345.html"&gt;跟我做WinForm开发（2）-后台逻辑操作&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2315636.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2012/01/07/2315636.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2011/12/08/2281072.html</id><title type="text">删除项目文件/文件夹IIS重启，Session丢失问题</title><summary type="text">最近在做一个项目，涉及到大量文件中转（先上传到本项目的某个文件夹中，在移动到FTP中），后面发现每次一删除文件之后在做操作都会提示未登录，刚开始以为是WebService Session丢失问题，后面发现缓存也更新了。仔细一看，SSO返回的ticket也不相同，才发现原来IIS重启了，最后解决方案如下： 新建一个类继承IHttpModule /// &lt;summary&gt; /// Stops th...</summary><published>2011-12-08T09:53:00Z</published><updated>2011-12-08T09:53:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2011/12/08/2281072.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2011/12/08/2281072.html"/><content type="html">&lt;p&gt;最近在做一个项目，涉及到大量文件中转（先上传到本项目的某个文件夹中，在移动到FTP中），后面发现每次一删除文件之后在做操作都会提示未登录，刚开始以为是WebService Session丢失问题，后面发现缓存也更新了。仔细一看，SSO返回的ticket也不相同，才发现原来IIS重启了，最后解决方案如下：&lt;/p&gt;  &lt;p&gt;新建一个类继承IHttpModule&lt;/p&gt;  &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt; &lt;br/&gt;/// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;Stops the ASP.NET AppDomain being restarted (which clears &lt;br/&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: #99a38a"&gt;Session state, Cache etc.) whenever a folder is deleted. &lt;br/&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;StopAppDomainRestartOnFolderDeleteModule &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;: &lt;/span&gt;&lt;span style="color: #8c8cb4"&gt;IHttpModule&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;private static bool &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DisableFCNs &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;false&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Init(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;HttpApplication &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;context)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(DisableFCNs) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;PropertyInfo &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;p &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;HttpRuntime&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetProperty(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;FileChangesMonitor&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;NonPublic &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Public &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Static);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;object &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;o &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;p&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetValue(&lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FieldInfo &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;o&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetField(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;_dirMonSubdirs&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Instance &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;NonPublic &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IgnoreCase);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;object &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;monitor &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetValue(o);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodInfo &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;m &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;monitor&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetMethod(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;StopMonitoring&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Instance &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;| &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;NonPublic);&lt;br/&gt;        m&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Invoke(monitor, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new object&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] { });&lt;br/&gt;        DisableFCNs &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;true&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Dispose() { }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;随后在Web.Config中加入Module配置&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #66747b"&gt;解决删除项目文件/文件夹引起的IIS重启&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;--&amp;gt;&lt;br/&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;add &lt;/span&gt;&lt;span style="color: #678cb1"&gt;name&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #ec7600"&gt;stopAppDomainRestartOnFolderDelete&lt;/span&gt;&amp;quot; &lt;span style="color: #678cb1"&gt;type&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #ec7600"&gt;DeployAssistant.Facade.Web.StopAppDomainRestartOnFolderDeleteModule,DeployAssistant.Facade&lt;/span&gt;&amp;quot;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;这样每次再删除文件/文件夹AppDomain都不会重启了，Session也不会丢失了。世界也变得更美好了！&lt;/p&gt;&lt;p&gt;PS：Web.Config和bin文件夹下的改动依然会让Web重启，这也是必须保留的！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2281072.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/12/08/2281072.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2011/11/15/2249108.html</id><title type="text">细说文件读写操作（读写锁）</title><summary type="text">开发过程中，我们玩玩需要大量与文件交互，读文件，写文件已成家常便饭，本地运行完美，但一上到投产环境，往往会出现很多令人措手不及的意外，或开发中的烦恼，因此，我对普通的C#文件操作做了一次总结，问题大部分如下： 1：写入一些内容到某个文件中，在另一个进程/线程/后续操作中要读取文件内容的时候报异常，提示System.IO.IOException: 文件“XXX”正由另一进程使用，因此该进程无法访...</summary><published>2011-11-14T16:20:00Z</published><updated>2011-11-14T16:20:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2011/11/15/2249108.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2011/11/15/2249108.html"/><content type="html">&lt;p&gt;开发过程中，我们玩玩需要大量与文件交互，读文件，写文件已成家常便饭，本地运行完美，但一上到投产环境，往往会出现很多令人措手不及的意外，或开发中的烦恼，因此，我对普通的C#文件操作做了一次总结，问题大部分如下：&lt;/p&gt;  &lt;p&gt;1：写入一些内容到某个文件中，在另一个进程/线程/后续操作中要读取文件内容的时候报异常，提示&lt;strong&gt;&amp;#160;&lt;font color="#ff0000"&gt;System.IO.IOException: 文件“XXX”正由另一进程使用，因此该进程无法访问此文件。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;2：在对一个文件进行一些操作后（读/写），随后想追加依然报&lt;font color="#ff0000"&gt;&lt;strong&gt;System.IO.IOException: 文件“XXX”正由另一进程使用，因此该进程无法访问此文件。&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;次问题与1相似。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;3：对一个文件进行一些操作后，想删除文件，依然报&lt;strong&gt;&lt;font color="#ff0000"&gt;System.IO.IOException: 文件“XXX”正由另一进程使用，因此该进程无法访问此文件。&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;看到这些，有经验的同学应该就会说资源没被释放掉，但也存在如下可能性。我们对文件的操作非常频繁，所以写了特定的操作类/组件来维护文件之间的操作，知道特定的时刻才结束，常见的如日志，随着程序的启动便开始写日志，直到程序关闭。但此中也存在我们需要提供一个特殊的操作（读/写/删除）来操作文件，例如我们需要提供一个日志查看器来查看当前日志或所有日志，这时，便无可避免的发生了以上的问题。&lt;/font&gt;&lt;/p&gt;  &lt;span style="color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileMode &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fileMode, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fileAccess, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fileShare)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;please input your content.&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;content &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ReadLine();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileStream &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fs &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileStream&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(FILEPATH, fileMode, fileAccess, fileShare);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;buffer &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Encoding&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Default&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetBytes(content);&lt;br/&gt;    fs&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write(buffer, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, buffer&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length);&lt;br/&gt;    fs&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Flush();&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;首先，我声明了一个写文件方法，并调用它，它将我输入的内容写入指定的文件当中。&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;WriteFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileMode&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Create, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ReadKey();&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/20111115001931419.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019323036.png" width="244" height="94" /&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019337430.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019331791.png" width="198" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;但是，在写文件操作结束之后，我并没有释放掉文件流的资源。所以，此时会对文件造成一个锁。我尝试在windows中删除它。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019353087.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019365430.png" width="393" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;很明显我无法删除掉这个文件，接下来，我尝试读取它。&lt;/p&gt;&lt;span style="color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ReadFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fileAccess, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fileShare)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileStream &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fs &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileStream&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(FILEPATH, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileMode&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Open, fileAccess, fileShare);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;buffer &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new byte&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[fs&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length];&lt;br/&gt;    fs&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Position &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;    fs&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read(buffer, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, buffer&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Encoding&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Default&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetString(buffer));&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;我实现了一个读文件方法，并调用了它。&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;WriteFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileMode&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Create, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;ReadFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;一切都很简单，访问模式为只读，这样应该就不会与上面的写锁进行冲突！&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019371461.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019383313.png" width="625" height="92" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;但是，结果并非我们所预想的那样，为什么会提示无法访问？回想一下，在前面，我用windows的记事本打开了这个文件，并没有提示说文件被锁定，我也的确能访问，那为何到了程序里就无法访问了呢？或许，我们应该把重点放在&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.io.filemode.aspx" target="_blank"&gt;FileMode&lt;/a&gt;，&lt;a href="http://msdn.microsoft.com/zh-cn/library/4z36sx0f.aspx" target="_blank"&gt;FileAccess&lt;/a&gt;，&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.io.fileshare.aspx" target="_blank"&gt;FileShare&lt;/a&gt;这三个枚举身上，说不定就是它们搞的鬼。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FileMode&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MSDN上的解释是指定操作系统打开文件的方式，我想这个应该不需要解释了，大家平时用得比较多了。MSDN的表格也很好的阐述了各个枚举值的作用，我就不在解释了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FileAccess&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;定义用于文件读取、写入或读取/写入访问权限的常数。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019385756.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019395624.png" width="693" height="162" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这个枚举也用得比较多了，描述也很通俗易懂，我也不便再解释了。^_^!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FileShare&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;相信这个枚举类型大家会比较陌生，甚至有同学见都没见过（惭愧的是，我也是才认识它没多久），陌生归陌生，但它的作用力也是不可低估，只是.Net帮我们把它封装得比较好，以至于我们一度认为它不是什么重要角色。好吧，进入主题！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;包含用于控制其他 &lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.io.filestream.aspx"&gt;&lt;strong&gt;FileStream&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 对象对同一文件可以具有的访问类型的常数。&lt;/strong&gt;这句话是什么意思呢？说实话，我现在看句话还是觉得很纠结，相信很多同学看到也是一头雾水，没关系，我们先跳过！&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019447670.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019461027.png" width="848" height="257" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;看它的成员描述，和&lt;a href="http://msdn.microsoft.com/zh-cn/library/4z36sx0f.aspx" target="_blank"&gt;FileAccess&lt;/a&gt;很是相似，那我们就尝试着来揭开它暂时神秘的面纱吧！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FileShare.Read&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;从字面上的意思，我们可以理解为首先打开一个文件之后（资源未释放），我们可以再用只读的方式读取文件从而不会抛出文件无法访问的异常。利用刚才实现的方法，可以轻易的再完成这个实验：&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;WriteFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileMode&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Create, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;ReadFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019467929.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019475322.png" width="593" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这是什么回事？不是都设置成已读了吗？或许只能在读文件的时候才能设置为只读共享。我们再尝试一下：&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;ReadFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;ReadFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019486335.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019497108.png" width="224" height="98" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这次的确是能在第一次没释放资源时再读，那我们再试试能否在设置只读共享后写文件：&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;ReadFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;WriteFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileMode&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Create, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019505090.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/20111115001951531.png" width="724" height="112" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;首先正确的读出了文件的内容，但当我尝试写入一些内容的时候却又报错了。那么，根据以上的实验，就可以得知这个只读的共享只有是在&lt;font color="#ff0000"&gt;&lt;strong&gt;连续读取文件&lt;/strong&gt;&lt;/font&gt;才有效！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FileShare.Write&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;结合Read的经验，字面上的意思应该可以理解为，只有在写文件时设置共享方式为Write，随后才能继续写入文件，否则会抛出异常。这里比较好玩的时，设置Write之后，万能的Window记事本也打不开文件了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019518513.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/20111115001952366.png" width="408" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FileShare.ReadWrite&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有了以上的经验，从字面上理解，可以认为这个ReadWrite一定是结合了Read和Write的特性。那到底它有什么用呢？上面我们知道，在读文件设置Read共享能继续读而不能写，在写文件时设置Write共享则能继续写而不能读，但是当我们设置了写共享后并想读取文件时怎么办？只能先释放资源再重新加载了吗？不需要，ReadWrite就是为此而生的。&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;WriteFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileMode&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Create, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read);&lt;br/&gt;ReadFile(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Read, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileShare&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ReadWrite);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019531729.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019544661.png" width="330" height="157" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;不过这里写文件的时候并不允许把共享设置成Write，否则读文件时用ReadWrite则无效（报异常），但都设置为ReadWrite可以。这一定，便可以解决很多日常开发中的烦恼。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FileShare.None/FileShare.Delete&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有了上面的经验，相信这两个你也很容易的就理解了，None则为不允许后续有任何操作，而Delete则是允许你随后进行删除操作。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;黑箱子里的内容&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于文件操作，我们平常使用的比较多的可能是以下几种：&lt;/p&gt;&lt;span style="color: #678cb1"&gt;File&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AppendAllText(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;......&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;File&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AppendAllLines(&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;...&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;File&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AppendText(&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;...&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileStream &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;fs &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileStream&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(path, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FileAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write);&lt;br/&gt;fs&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Write(&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;....&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;实际上它们也是在内部初始化了&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.io.filemode.aspx" target="_blank"&gt;FileMode&lt;/a&gt;/&lt;a href="http://msdn.microsoft.com/zh-cn/library/4z36sx0f.aspx" target="_blank"&gt;FileAccess&lt;/a&gt;/&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.io.fileshare.aspx" target="_blank"&gt;FileShare&lt;/a&gt;，例如File的静态方法最后都会生成一&lt;/p&gt;&lt;p&gt;个Stream实例，其中便调用了私有方法&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019547660.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201111/201111150019555609.png" width="789" height="76" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;尾声&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现在，我们明白了，其实/&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.io.fileshare.aspx" target="_blank"&gt;FileShare&lt;/a&gt;就是控制文件流的“访问权限”，当然，这仅仅是入门的文件操作，自己做了笔记，也希望能给大家带来帮助，高级篇园子里已经有不少前辈写了文件读写锁方面的文章，感兴趣的同学可有搜索一下，前去观摩！！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2249108.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/11/15/2249108.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2011/08/29/2156972.html</id><title type="text">您真的了解类型转换吗？请止步，解惑！</title><summary type="text">不久前，因为对类型转换CLR的底层实现很朦胧，万不得已下，发了一篇博文请园里的各位同学，大大解惑。 您真的了解类型转换吗？请止步，求解！ 很多热心的园友纷纷发表了自己的意见和见解，在各位童鞋的帮助下，逐渐理清了类型转换的内幕（也可能并不是很正确！），于是想再整理一次，欢迎大家指正，而且也延发了其他的问题，想与大家一起讨论。 类型转换的疑惑 在上个问题中，我声明了两个类，父类Person，子...</summary><published>2011-08-28T16:11:00Z</published><updated>2011-08-28T16:11:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2011/08/29/2156972.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2011/08/29/2156972.html"/><content type="html">&lt;p&gt;不久前，因为对类型转换CLR的底层实现很朦胧，万不得已下，发了一篇博文请园里的各位同学，大大解惑。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/08/24/2152693.html"&gt;您真的了解类型转换吗？请止步，求解！&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;很多热心的园友纷纷发表了自己的意见和见解，在各位童鞋的帮助下，逐渐理清了类型转换的内幕（也可能并不是很正确！），于是想再整理一次，欢迎大家指正，而且也延发了其他的问题，想与大家一起讨论。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;类型转换的疑惑&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在上个问题中，我声明了两个类，父类Person，子类Employee，当我实例化一个子类实例，并将其赋给父类的一个变量时，我很好奇，且不了解明明是子类的实例，结果能识别到父类的方法，也就是为什么能知道是父类调用了方法。&lt;/p&gt;  &lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;ClassConvert&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public static void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Main()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    Employee kinsen;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;object &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;obj;&lt;br/&gt;    Person kong;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run()&lt;br/&gt;    {&lt;br/&gt;        kinsen &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Kinsen&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Chan&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;        kinsen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;        kong &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen;&lt;br/&gt;        kong&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;        obj &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ReadLine();&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(kinsen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(kong&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(obj&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ReadLine();&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName { &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #93c763"&gt;set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName { &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #93c763"&gt;set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastName)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastName;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Hello,Word&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public override string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;: Person&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastname) : &lt;/span&gt;&lt;span style="color: #93c763"&gt;base&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(firstname, lastname) { }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;new public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Hello,Word!My Name is &amp;quot; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #93c763"&gt;base&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName);&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;运行结果如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/20110829001025881.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108290010293516.png" width="402" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们知道，引用类型主要数据信息是存放在托管堆中，而这块内存中包含三大块，同步快，类型句柄已经实例信息，对于类型转换也仅仅是一个isinst或castclass指令（相见《.Net本质论 79页》）。最后把块托管堆上的地址赋给线程栈上的变量，也就是说线程栈上的内存仅仅保存了一个指向托管堆上的实例地址，而托管堆上仅有该实例的数据，已经类型句柄等数据，其中类型句柄又指向该实例的具体方法实例，其中包含了方法表等类型信息。于是最后我们看到三个变量的GetType都是第一个New出来的对象。但是为什么调用的方法输出却不同，父类变量能正确的调用它的方法，这又是为什么呢？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方法表与方法槽表&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这其中涉及到方法表与方法槽表等方面的知识，然而关于这块内部的实现，MSDN却没有什么官方资料，仅仅只能从一些MVP和开发者的笔下了解到这块的存在。在上篇博文中，Anders Tan大哥对这方面做了一个解释：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;方法表并不是指简单的方法列表。它包含了很多的东西，它代表了一个class（不是class的实例对象），其中既有方法列表也有static成员等等，所以这也就解释了为什么同一个class的实例中的static都是一样的，因为static成员就存放在方法表中，而每个实例的type handle都指向自身class的方法表。接着方法表是一个包含很多元素的一个对象，所以在其中的方法列表也就是给了另外一个概念，就是方法槽表，在方法槽表中的方法也是按一定顺序排列的。首先是父类的virtual方法，然后是自身的virtual方法，如果是override了父类的方法，那么父类的virtual方法就会被子类的方法所覆盖(这也就解释了在polymorphism下，向上转型后调用virtual方法会执行真正实例的方法)，接着是实例方法和静态方法。在方法槽后就是static成员。单是方法槽表本身并不包含其中各个方法的地址，我们知道.net程序在编译后是IL代码，但是在执行的时候由JIT再编译为本地代码，那么在方法调用和方法体的关联就会在执行后发生变化，而这个变化并不在方法槽表中处理，而是交给了方法描述。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;《.Net本质论》对这块也有详细的描述：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;方法表是一个带有长度前缀的内存地址数组，每个方法都有一个入口项。CLR方法表既包含实例来方法的入口，有包括静态方法的入口。（《.Net本质论》P155第一段倒数第三行，以下若无特别说明，则都摘自《.Net 本质论》）&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;CLR通过方法的声明类型的方法表路由（route）所有的方法调用。（P155第二段）&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;类型方法表的每个入口项指向一个唯一的存根例程（stub routine）。初始化时，每个存根例程包含一个对于CLR的JIT编译器的调用（它由内部的PreStubWorker程序公开）P156第二段&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;在这里，我并不打算深究方法表与方法槽表，仅仅是对于它们做一个简单的介绍，了解它们是什么，好方便我进一步的探究。&lt;/p&gt;&lt;p&gt;那什么是方法槽表，本质论中没有对槽表做一个明确的定义，但是从描述中我们也可以“想象”出它该有的形象，方法槽表顾名思义，是一张表结构的数据类型，可以将其想象成一排排的USB接口（槽口）,槽口上插入（保存）的就是方法表上的偏移量（定位了方法表上的方法）。方法槽表上的顺序首先是父类的virtual方法，然后是自身的virtual方法,再是自身的方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;多态方法表（槽表）的内在模式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CLR中，声明一个方法，都会为该方法加上一个newslot标记，表明这是一个新方法，若一个方法声明为virtual且没有标明newslot标记，那么CLR就将其看成是一个新方法，否则就看成是基类同名方法的重写，如果标明了newslot,那槽表上开辟多一个槽位来保存这个新方法，若虚方法没有标明newslot，则把方法槽表上相应的“槽位”变成新方法的方法表偏移量，否则（没有重写虚方法），保存了基类方法的方法表偏移量。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;具体调用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;那么说了那么多，到底类型是怎么转换的？原来，我都过多的把中心放在数据中（内存）,期望从托管堆，线程栈上找到什么。当然，这注定失败，我完全忽略了代码的作用，毕竟，程序的执行也就是逐步执行代码（指令/机器码）,上篇博文中&lt;a href="http://www.cnblogs.com/qmxle/"&gt;qmxle&lt;/a&gt;童鞋提到IL的实现，让我醍醐灌顶，茅舍顿开。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;楼主，SayHello()方法不是虚方法的话，是在编译时绑定的。看看IL代码就明白了：     &lt;br /&gt;IL_000b: newobj instance void ConsoleApplication15.Program/Employee::.ctor(string,     &lt;br /&gt;string)     &lt;br /&gt;IL_0010: stloc.0     &lt;br /&gt;IL_0011: ldloc.0     &lt;br /&gt;IL_0012: callvirt instance void ConsoleApplication15.Program/Employee::SayHello()     &lt;br /&gt;IL_0017: nop     &lt;br /&gt;IL_0018: ldloc.0     &lt;br /&gt;IL_0019: stloc.1     &lt;br /&gt;IL_001a: ldloc.1     &lt;br /&gt;IL_001b: callvirt instance void ConsoleApplication15.Program/Person::SayHello()     &lt;br /&gt;第一个SayHello()方法，绑定的是Employee类型；第二个SayHello()方法，绑定的是Person类型。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这也就符合了《.Net本质论》中的说法。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;当从一个对象引用的类型转换到另一个对象引用的类型时，必须考虑两个类型之间的关系。如果初始化引用的类型被认定与新引用的类型兼容，那么，CLR所要做的转换只是一个简单的IA-32 mov指令。这通常出现于这样的赋值情形中；当一个派生类型的引用到一个直接或间接基类的引用，或则到一个一直兼容的接口引用。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;所以引用类型之间的类型转换并不存在什么效率消耗的问题，它们之间的效率消耗仅仅在转换之前做一个兼容性检查时会消耗CPU时间，而不像装箱，拆箱那样很大的性能消耗。对于新类型的操作，就是依靠CPU指令（代码）来识别了。看最后生成的IL：&lt;/p&gt;&lt;span style="color: #66747b"&gt;//省略前面...&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_000c:  newobj     instance &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ctor(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;,&lt;br/&gt;                                                               &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;  IL_0011:  stfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen&lt;br/&gt;  IL_0016:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_0017:  ldfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen&lt;br/&gt;  IL_001c:  callvirt   instance &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;  IL_0021:  nop&lt;br/&gt;  IL_0022:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_0023:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_0024:  ldfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen&lt;br/&gt;  IL_0029:  stfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong&lt;br/&gt;  IL_002e:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_002f:  ldfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong&lt;br/&gt;  IL_0034:  callvirt   instance &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//省略后面...&lt;br/&gt;&lt;/span&gt;&lt;p&gt;从上面可以看出,kinsen变量调用的是Employee的SayHello方法，而Kong变量调用的是Person的SayHello方法。这是因为&lt;/p&gt;&lt;p&gt;SayHello方法不是虚方法，且Employee类对SayHello方法用了new关键字，CLR识别了它们不是同一个方法，但是这样，我又引发了另一个问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;新问题！您知道吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;从上面的IL中，可以看到，分别调用了Employee和Person类SayHello，下面，我们把SayHello改成虚方法，并重写。&lt;/p&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName { &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #93c763"&gt;set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName { &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #93c763"&gt;set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastName)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastName;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public virtual void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Hello,Word&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public override string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;: Person&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastname) : &lt;/span&gt;&lt;span style="color: #93c763"&gt;base&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(firstname, lastname) { }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;override public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Hello,Word!My Name is &amp;quot; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #93c763"&gt;base&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName);&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;p&gt;结果如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108290010308434.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/20110829001034513.png" width="328" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;现在他们的输出一样了，我们再看看生成的IL。&lt;/p&gt;  &lt;span style="color: #f1f2f3"&gt;IL_000c:  newobj     instance &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ctor(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;,&lt;br/&gt;                                                               &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;br/&gt;  IL_0011:  stfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen&lt;br/&gt;  IL_0016:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_0017:  ldfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen&lt;br/&gt;  IL_001c:  callvirt   instance &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;  IL_0021:  nop&lt;br/&gt;  IL_0022:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_0023:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_0024:  ldfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen&lt;br/&gt;  IL_0029:  stfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong&lt;br/&gt;  IL_002e:  ldarg&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IL_002f:  ldfld      &lt;/span&gt;&lt;span style="color: #93c763"&gt;class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong&lt;br/&gt;  IL_0034:  callvirt   instance &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;::&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;&lt;/span&gt;&lt;p&gt;现在，它们调用的都是Person类的SayHello了，为什么会变成Person呢？预想中应该是Employee类的SayHello才对，如果调用&lt;/p&gt;&lt;p&gt;Employee类的SayHello方法，那一切都能合理的解释，但调用Person，程序是如何确定是Employee的SayHello方法呢？另外，我知道每个类型维护一张方法表，依稀记得一篇MSDN杂志上的文章说，如果在子类中找不到相关调用的方法，则会去父类的方法表中找，那么也就是子类和父类维护的方法表不一样，子类的方法表中不会出现父类的方法？或许，在这里的调用程序如此，首先，会根据当前实例instance找到类型句柄，定位到方法槽表，然后寻找槽表中匹配的方法，随后调用？如果是如我猜想的这般，子类重写的虚方法在方法槽表中的名称还是父类方法的全名，而非子类的名称？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;尾声&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;希望各位童鞋发表自己的见解，也希望各位大大能抒发所学，不吝解答！对于上篇文章，很多童鞋都给出了自己的见解，给我理清概念有很大的帮助，在此很感谢大家，希望大家继续发光发热！：-）&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2156972.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/08/29/2156972.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2011/08/24/2152693.html</id><title type="text">您真的了解类型转换吗？请止步，求解！</title><summary type="text">前阵子，一名同事问及类型转换的问题，我也仅仅说出目前自己的了解。但回头想想，其中的确大有学问，以前只看到了表面，其内在的表现如何，苦苦翻书，Google几番之后，依然无所收获，故大胆写下，求园中各位大牛不吝解答。 类型转换的疑惑 首先，我们知道类型转换也就那点事（表面的说），总归而言，C#下有几种转换，装箱，拆箱，向上类型转换，向下类型转换，平行类型转换几种。这几种的区别目前也不细说了，感兴趣...</summary><published>2011-08-24T15:57:00Z</published><updated>2011-08-24T15:57:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2011/08/24/2152693.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2011/08/24/2152693.html"/><content type="html">&lt;p&gt;前阵子，一名同事问及类型转换的问题，我也仅仅说出目前自己的了解。但回头想想，其中的确大有学问，以前只看到了表面，其内在的表现如何，苦苦翻书，Google几番之后，依然无所收获，故大胆写下，求园中各位大牛不吝解答。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;类型转换的疑惑&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;首先，我们知道类型转换也就那点事（表面的说），总归而言，C#下有几种转换，装箱，拆箱，向上类型转换，向下类型转换，平行类型转换几种。这几种的区别目前也不细说了，感兴趣的童鞋可移步&lt;a href="http://kb.cnblogs.com/page/42154/" target="_blank"&gt;C# 装箱和拆箱[整理]&lt;/a&gt;,&lt;font color="#9b00d3"&gt;向上类型转换，向下类型转换，平行类型(.&lt;font color="#ff0000"&gt;Net本质论79页-运行时的类型&lt;/font&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#333333"&gt;依照以往的知识，现在我们假设有一个Person类，再有一个Employee类，Employee继承Person，声明一个Employee的实例，并将其赋给一个Person的实例，由于类型是引用类型，则实际上它们都是指向同一个对象实例。代码如下：&lt;/font&gt;&lt;/p&gt;              &lt;span style="color: #678cb1"&gt;Employee &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Kinsen"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Chan"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;这一点应该是毫无疑问的。问题是，已知在构造一个实例的时候，实际上是在堆栈上开辟一块空间，这块空间包含三块，分别是同步&lt;/p&gt;&lt;p&gt;块，类型句柄，以及实例具体信息。我们就是通过类型句柄来获得该实例的具体对象。但此时Person类实例kong指向的是kinsen实例的地址，那么该类型句柄的信息也应该是Employee而非Person的。但偏偏我们却能正确的获取到Person的方法，也能正确的执行，看一下代码&lt;/p&gt;    &lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Program&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Main(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] args)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Kinsen"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Chan"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            kinsen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen;&lt;br/&gt;            kong&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;public string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName { &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #93c763"&gt;set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;public string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName { &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #93c763"&gt;set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastName)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastName;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Hello,Word"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;public override string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString()&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #ec7600"&gt;" " &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;: &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;firstname, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lastname) : &lt;/span&gt;&lt;span style="color: #93c763"&gt;base&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(firstname, lastname) { }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;new public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello()&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Hello,Word!My Name is " &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+ &lt;/span&gt;&lt;span style="color: #93c763"&gt;base&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;执行结果如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108242356239603.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108242356242470.png" width="323" height="146" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在这里我并没有采用虚方法，否则结果都是第一个了。可见，即使kong引用的是kinsen，但实际上它执行的还是Person类的方法。那么，到底是从哪里得知kong是Person类对象的呢？再见一个实验。&lt;/p&gt;            &lt;span style="color: #678cb1"&gt;Employee &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Kinsen"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Chan"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            kinsen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen;&lt;br/&gt;            kong&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;object &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;obj &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(kinsen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(kong&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(obj&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;&lt;/span&gt;&lt;p&gt;除了Employee和Person类实例，我们还将kong赋给了一个object，然后输出实例的类型，结果如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108242356255195.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108242356288519.png" width="318" height="179" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;可以看到，三个实例的实际类型都是Employee，但是Person类实例的确是执行了Person类的SayHello方法啊。这到底是为什么？&lt;/p&gt;&lt;p&gt;到处寻找答案，在《.Net本质论》79页中找到这么一段话：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;当从一个对象引用的类型转换到另一个对象引用的类型时，必须考虑两个类型之间的关系。如果初始化引用的类型被认定与新引用的类型兼容，那么，CLR所要做的转换只是一个简单的IA-32 mov指令。这通常出现于这样的赋值情形中；当一个派生类型的引用到一个直接或间接基类的引用，或则到一个一直兼容的接口引用。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;从这段话中，了解到为什么结果三个实例的类型都是Employee，但我想解决的问题还没解决，为何指向Employee实例引用的Person类实例还能准确的找到它的类型呢？目前我已知的信息如下：&lt;/p&gt;&lt;p&gt;实例地址，也就是线程栈上的地址，它只包含一个指向堆栈引用的指针。&lt;/p&gt;&lt;p&gt;堆栈内存块，也就是线程栈上保存那个指针指向的地址，它包含三部分，同步快，类型句柄，实例信息。其中类型句柄起到标识该实例所属类型，所拥有方法表等信息，但现状是三个实例指向的都是同一个内存地址，也就是它们是一模一样的。那它们到底是如何识别的？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;内存中的表现形式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我再借助SOS来探查具体的信息，稍微改动了下代码，以便在SOS中更好查看。&lt;/p&gt;        &lt;span style="color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Main(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] args)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Program&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run();&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;object &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;obj;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Person &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run()&lt;br/&gt;        {&lt;br/&gt;            kinsen &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Employee&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Kinsen"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;"Chan"&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            kinsen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;            kong &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kinsen;&lt;br/&gt;            kong&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SayHello();&lt;br/&gt;            obj &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;kong;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(kinsen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(kong&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(obj&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType());&lt;br/&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;通过！ClrStack命令得到当前对象的地址&lt;/p&gt;&lt;span style="color: #ffcd22"&gt;000000000023e7&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;e0 &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00190163 DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run()&lt;br/&gt;    PARAMETERS:&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;this &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0x00000000023c5ad0&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpobj &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0x00000000023c5ad0&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name: DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ClassConvert&lt;br/&gt;MethodTable: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033b68&lt;br/&gt;EEClass: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00182250&lt;br/&gt;Size: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;40&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0x28&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) bytes&lt;br/&gt; (E:\Projects\ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;exe)&lt;br/&gt;Fields:&lt;br/&gt;              MT    Field   Offset                 Type VT     Attr            Value Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033d68  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;4000001        8   &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;instance &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5b48 kinsen&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef43773f8  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;4000002       10        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Object  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;instance &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5b48 obj&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033ca0  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;4000003       18     &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;instance &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5b48 kong&lt;br/&gt;&lt;/span&gt;&lt;p&gt;这里能看到DebugTest.ClassConvert类有三个实例，分别是kinsen,obj和kong,它们的value都相同（00000000023c5b48），这里&lt;/p&gt;&lt;p&gt;的确与程序中看到的一模一样，但是注意，它们的MT，也就是方法表却不一样了。再分别把他们解析一下。&lt;/p&gt;&lt;span style="color: #66747b"&gt;//Name=kinsen&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpvc &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033d68  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5b48 &lt;br/&gt;Name: DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Employee&lt;br/&gt;MethodTable &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033d68&lt;br/&gt;EEClass: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00183498&lt;br/&gt;Size: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;32&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0x20&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) bytes&lt;br/&gt; (E:\Projects\ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;exe)&lt;br/&gt;Fields:&lt;br/&gt;              MT    Field   Offset                 Type VT     Attr            Value Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef4377b08  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;4000004        0        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;String  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;instance &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033d68 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;k__BackingField&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef4377b08  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;4000005        8        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;String  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;instance &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5af8 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;k__BackingField&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #66747b"&gt;//Name=obj&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpvc &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef43773f8  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5b48 &lt;br/&gt;Name: System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Object&lt;br/&gt;MethodTable &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef43773f8&lt;br/&gt;EEClass: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef3f42200&lt;br/&gt;Size: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;24&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0x18&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) bytes&lt;br/&gt; (C:\Windows\assembly\GAC_64\mscorlib\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;2.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\mscorlib&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll)&lt;br/&gt;Fields:&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #66747b"&gt;//Name=kong&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpvc &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033ca0  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5b48 &lt;br/&gt;Name: DebugTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Person&lt;br/&gt;MethodTable &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033ca0&lt;br/&gt;EEClass: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f001833f0&lt;br/&gt;Size: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;32&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0x20&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) bytes&lt;br/&gt; (E:\Projects\ClassConvert&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;exe)&lt;br/&gt;Fields:&lt;br/&gt;              MT    Field   Offset                 Type VT     Attr            Value Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef4377b08  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;4000004        0        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;String  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;instance &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;f00033d68 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FirstName&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;k__BackingField&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000007f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ef4377b08  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;4000005        8        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;String  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;instance &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00000000023&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c5af8 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LastName&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;k__BackingField&lt;br/&gt;&lt;/span&gt;&lt;p&gt;或许到这里，的确能解释为什么即使指向的对象是同一个，但却能在转换成其他类型之后做该类型的操作，但是&lt;/p&gt;&lt;p&gt;其中还是如一个黑匣子，我对此依然不明不白。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;令人向往的方法表，方法槽表&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;此外，还有一张图，&lt;/p&gt;&lt;p&gt;&lt;img src="http://i.msdn.microsoft.com/cc163791.fig09(en-us).gif"  alt="" /&gt;&lt;/p&gt;&lt;p&gt;这张图出自微软，对于一些概念，我还是比较模糊，例如方法表，方法槽表，SOS中的MT应该是方法表呢？还是方法槽表？从图上看来，方法表的分布比较散，看起来好像没什么规则，这样又如何确定方法槽表，方法表与方法槽表之间的关系又是如何呢？很希望大家能踊跃回答，如果有详细的资料就更好了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;渴望音讯&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关于这个类型转换，类型句柄，方法表的问题纠结折腾了我许久，实在没办法了。才大胆发出来，恳求各位前辈，大大能帮小弟解惑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更多&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可能也有童鞋也和我有一样的疑问，以下是一些我查找的知识点来源&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html"&gt;&lt;font size="2"&gt;揭示同步块索引（上）：从lock开始&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yuyijq/archive/2009/08/13/1545617.html"&gt;揭示同步块索引（中）：如何获得对象的HashCode&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yuyijq/archive/2009/08/18/1549022.html"&gt;揭示同步块索引(下):总结&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artech/archive/2010/10/18/CLR_Memory_Mgt_01.html"&gt;关于CLR内存管理一些深层次的讨论[上篇]&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true" target="_blank"&gt;深入探索.NET框架内部了解CLR如何创建运行时对象&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2152693.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/08/24/2152693.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2011/08/01/2123459.html</id><title type="text">基于AppDomain的&amp;quot;插件式&amp;quot;开发</title><summary type="text">很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统,这个WinService系统管理的形形色色各种各样的服务,这些服务也是各个"插件式"的类库,例如: 我们提供了一个IJob接口,所有"服务"都继承该接口,然后做相关的配置,在服务启动时,就可以根据配...</summary><published>2011-08-01T01:58:00Z</published><updated>2011-08-01T01:58:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2011/08/01/2123459.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2011/08/01/2123459.html"/><content type="html">&lt;p&gt;&lt;font size="2" face="YaHei Consolas Hybrid"&gt;很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统,这个WinService系统管理的形形色色各种各样的服务,这些服务也是各个&amp;quot;插件式&amp;quot;的类库,例如:&lt;/font&gt;&lt;/p&gt;      &lt;span style="color: #93c763"&gt;public interface &lt;/span&gt;&lt;span style="color: #8c8cb4"&gt;IJob&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DateTime &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;time);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;CollectUserInfo &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;: &lt;/span&gt;&lt;span style="color: #8c8cb4"&gt;IJob&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DateTime &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;time)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #66747b"&gt;//doing some thing...&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#333333" face="Verdana"&gt;我们提供了一个IJob接口,所有&amp;quot;服务&amp;quot;都继承该接口,然后做相关的配置,在服务启动时,就可以根据配置,反射加载程序集,执行我们预期的任务.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更新程序集(dll/exe)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#333333"&gt;服务/插件程序(&lt;font style="background-color: #00ff00"&gt;后面只称为服务,虽然两者应用不同,但是在此处他们所运用的原理和作用是相同的 :-)&lt;/font&gt; )很健稳的运行着.但在服务/插件程序运行一段时间之后,某些&amp;quot;插件&amp;quot;的业务需求发生的变化,或者版本升级等种种外部原因,导致我们对原本的&amp;quot;插件&amp;quot;程序集进行了升级(可能从v1.0升级至v2.0).当我们想像Asp.net应用一样.把新的dll替换旧dll的时候,错误发生了.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957381943.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957429039.png" width="407" height="239" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;发生该错误的原因很简单,因为我们的程序中已经调用了该dll,那么在CLR加载该dll到文件流中也给其加了锁,所以,当我们要进行覆盖,修改,删除的时候自然就无法操作该文件了.那我们该怎么做?为什么Asp.net可以直接覆盖?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AppDomain登场&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们知道,AppDomain是.Net平台里一个很重要的特性,在.Net以前,每个程序是&amp;quot;封装&amp;quot;在不同的进程中的,这样导致的结果就造就占用资源大,可复用性低等缺点.而AppDomain在同一个进程内划分出多个&amp;quot;域&amp;quot;,一个进程可以运行多个应用,提高了资源的复用性,数据通信等.详见&lt;a href="http://msdn.microsoft.com/library/ZH-CN/113A8BBF-6875-4A72-A49D-CA2D92E19CC8(VS.100)" target="_blank"&gt;应用程序域&lt;/a&gt;&lt;/p&gt;&lt;p&gt;CLR在启动的时候会创建系统域(System Domain),共享域(Shared Domain)和默认域(Default Domain),系统域与共享域对于用户是不可见的,默认域也可以说是当前域,它承载了当前应用程序的各类信息(堆栈),所以,我们的一切操作都是在这个默认域上进行.&amp;quot;插件式&amp;quot;开发很大程度上就是依靠AppDomain来进行.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;热插拔&amp;quot;实现说明&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当加载了一个程序集之后,该程序集就会被加入到指定AppDomain中,按照原来的想法,要实现&amp;quot;热插拔&amp;quot;,只要在需要使用该&amp;quot;插件&amp;quot;的时候,加载该&amp;quot;插件&amp;quot;的程序集(dll),使用结束后,卸载掉该程序集便可达到我们预期的效果.加载程序集很简单,.C#提供一个Assembly类,方便又快捷.&lt;/p&gt;&lt;span style="color: #93c763"&gt;var  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_assembly &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Assembly&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LoadFrom(assemblyFile);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;Assembly提供了数个加载方法详见Assembly类.&lt;/p&gt;&lt;p&gt;然后,C#却没有提供卸载程序集的方法,唯一能卸载程序集的方法只有卸载该程序集所在的AppDomain,这样,该AppDomain下的程序集都会被释放.知道这一点,我们便可以利用AppDomain来达到我们预期的效果.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AppDomain实现&amp;quot;热插拔&amp;quot;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先,我们需要先实例化一个新AppDomain作为&amp;quot;插件&amp;quot;的宿主.在实例化一个Domain之前,先声明该Domain的一些基本配置信息&lt;/p&gt;            &lt;span style="color: #678cb1"&gt;AppDomainSetup &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;setup &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomainSetup&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;ApplicationLoader&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;    &lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationBase &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;BaseDirectory;  &lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;PrivateBinPath &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Path&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Combine(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;BaseDirectory, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;private&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CachePath &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationBase;&lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ShadowCopyFiles &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//启用影像复制程序集&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ShadowCopyDirectories &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationBase;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SetShadowCopyFiles();&lt;br/&gt;&lt;/span&gt;&lt;p&gt;setup.ShadowCopyFiles = &amp;quot;true&amp;quot;;这句很重要,其作用就是启用影像复制程序集,什么是&lt;a href="http://msdn.microsoft.com/library/ZH-CN/DE8B8759-FCA7-4260-896B-5A4973157672(VS.100)" target="_blank"&gt;影像复制程序集&lt;/a&gt;,复制程序集是保证&amp;quot;热插拔&amp;quot;&lt;/p&gt;&lt;p&gt;实现的主要工作.AppDomain加载程序集的时候,如果没有ShadowCopyFiles,那就直接加载程序集,结果就是程序集被锁定,相反,如果启用了ShadowCopyFiles,则CLR会将准备加载的程序集拷贝一份至CachePath,再加载CachePath的这一份程序集,这样原程序集也就不会被锁定了. AppDomain.CurrentDomain.SetShadowCopyFiles();的作用就是当前AppDomain也启用ShadowCopyFiles,在此,当前AppDomain也就是前面我们说过的那个默认域(Default Domain),为什么当前域也要启用ShadowCopyFiles呢?&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;主AppDomian在调用子AppDomain提供过来的类型,方法,属性的时候,也会将该程序集添加到自身程序集引用当中去,所以,&amp;quot;插件&amp;quot;程序集就被主AppDomain锁定,这也是为什么创建了单独的AppDomain程序集也不能删除,替换(释放)的根本原因&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;利用SOS,可以很清楚的看到这一点&lt;/p&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;018&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpdomain&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;--------------------------------------&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;System Domain:      &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b912478&lt;br/&gt;LowFrequencyHeap:   &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b912784&lt;br/&gt;HighFrequencyHeap:  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b9127d0&lt;br/&gt;StubHeap:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b91281c&lt;br/&gt;Stage:              OPEN&lt;br/&gt;Name:               None&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;--------------------------------------&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Shared Domain:      &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b912140&lt;br/&gt;LowFrequencyHeap:   &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b912784&lt;br/&gt;HighFrequencyHeap:  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b9127d0&lt;br/&gt;StubHeap:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b91281c&lt;br/&gt;Stage:              OPEN&lt;br/&gt;Name:               None&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00109d&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;e0 [C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_32\mscorlib\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\mscorlib&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00110f68&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;58631000            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_32\mscorlib\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\mscorlib&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;--------------------------------------&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Domain &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000f4598&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LowFrequencyHeap:   &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000f4914&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;HighFrequencyHeap:  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000f4960&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;StubHeap:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000f49&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ac&lt;br/&gt;Stage:              OPEN&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;000f5568&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name:               AppDomainTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;exe&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00109d&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;e0 [C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_32\mscorlib\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\mscorlib&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00110f68&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001097&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b0&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;58631000            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_32\mscorlib\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\mscorlib&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0011d448 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[E:\Test\AppDomainTest\AppDomainTest\bin\Debug\AppDomainTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;exe]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00117f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;d0&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0011d3&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c0&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c2e9c            E:\Test\AppDomainTest\AppDomainTest\bin\Debug\AppDomainTest&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;exe&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00131370 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Forms\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Forms&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0011f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;a00&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001299&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;a0&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;579&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c1000            C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Forms\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Forms&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00131400 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Drawing\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b03f5f7f11d50a3a\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Drawing&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00131490&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0012e9&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c0&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;62661000            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Drawing\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b03f5f7f11d50a3a\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Drawing&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00131d20 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00133d08&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0012f078&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;aa81000            C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00131ed0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Configuration\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b03f5f7f11d50a3a\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Configuration&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001415&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;a8&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0012f430&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;a981000            C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Configuration\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b03f5f7f11d50a3a\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Configuration&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00132080 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Xml\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Xml&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00141620&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0012f5&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c8&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;546e1000            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_MSIL\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Xml\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Xml&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00132&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ce0 [E:\Test\AppDomainTest\AppDomainTest\bin\Debug\CrossDomainController&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b3450&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f94560&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c7428            E:\Test\AppDomainTest\AppDomainTest\bin\Debug\CrossDomainController&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00132350 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[C:\Users\kong\AppData\Local\assembly\dl3\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;6&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ZYK3XE9&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.86&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Q\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AQ35O7C&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;VHE\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1f704&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;bbb\b7cca5cf_8c4fcc01\ShowHelloPlug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DLL]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b32e8&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;070&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;a8620&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c7d78            C:\Users\kong\AppData\Local\assembly\dl3\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;6&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ZYK3XE9&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.86&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Q\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AQ35O7C&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;VHE\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1f704&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;bbb\b7cca5cf_8c4fcc01\ShowHelloPlug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DLL&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;--------------------------------------&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Domain &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;2&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;d0238&lt;br/&gt;LowFrequencyHeap:   &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;d05b4&lt;br/&gt;HighFrequencyHeap:  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;d0600&lt;br/&gt;StubHeap:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;d064c&lt;br/&gt;Stage:              OPEN&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06724510&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name:               ApplicationLoaderDomain&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00109d&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;e0 [C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_32\mscorlib\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\mscorlib&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00110f68&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f93&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;bd0&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;58631000            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;C:\Windows\Microsoft&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Net\assembly\GAC_32\mscorlib\v4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_4&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;.0.0.0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;__b77a5c561934e089\mscorlib&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dll&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00132e90 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[E:\Test\AppDomainTest\AppDomainTest\bin\Debug\ApplicationLoader\assembly\dl3\c91a2898\f6f7f865_9a4fcc01\CrossDomainController&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DLL]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b3540&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f92&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;be0&lt;br/&gt;  Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;a833c4            E:\Test\AppDomainTest\AppDomainTest\bin\Debug\ApplicationLoader\assembly\dl3\c91a2898\f6f7f865_9a4fcc01\CrossDomainController&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DLL&lt;br/&gt;&lt;br/&gt;Assembly:           &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001330d0 &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[E:\Test\AppDomainTest\AppDomainTest\bin\Debug\ApplicationLoader\assembly\dl3\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;32519346&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;\b7cca5cf_8c4fcc01\ShowHelloPlug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DLL]&lt;br/&gt;ClassLoader:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b39f0&lt;br/&gt;SecurityDescriptor: &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06f92f98&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Module Name&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;a83adc            E:\Test\AppDomainTest\AppDomainTest\bin\Debug\ApplicationLoader\assembly\dl3\&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;32519346&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;\b7cca5cf_8c4fcc01\ShowHelloPlug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DLL&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;除了新建的AppDomain(Domain2)中的Module引用了ShowHelloPlug.dll,默认域(Domian1)也有ShowHelloPlug.dll的&lt;/p&gt;&lt;p&gt;程序集引用.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;应用程序域之间的通信&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;每个AppDomain都有自己的堆栈,内存块,也就是说它们之间的数据并非共享了.若想共享数据,则涉及到应用程序域之间的通信.C#提供了&lt;a href="http://msdn.microsoft.com/library/ZH-CN/SYSTEM.MARSHALBYREFOBJECT(VS.100)" target="_blank"&gt;MarshalByRefObject类&lt;/a&gt;进行跨域通信,那么,我们必须提供自己的跨域访问器.&lt;/p&gt;    &lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;RemoteLoader &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;: &lt;/span&gt;&lt;span style="color: #678cb1"&gt;MarshalByRefObject&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;private &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Assembly &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_assembly;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LoadAssembly(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;assemblyFile)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;try&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;               _assembly &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Assembly&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LoadFrom(assemblyFile);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #66747b"&gt;//return _assembly;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;catch &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Exception &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ex)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;throw &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ex;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T GetInstance&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;typeName) &lt;/span&gt;&lt;span style="color: #93c763"&gt;where &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T : &lt;/span&gt;&lt;span style="color: #93c763"&gt;class&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(_assembly &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;type &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_assembly&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType(typeName);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(type &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Activator&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateInstance(type) &lt;/span&gt;&lt;span style="color: #93c763"&gt;as &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ExecuteMothod(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;typeName, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;methodName)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(_assembly &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;type &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_assembly&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType(typeName);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;obj &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Activator&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateInstance(type);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Action&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lambda &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Action&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Call(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Constant(obj), type&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetMethod(methodName)), &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Compile()();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;为了更好的操作这个跨域访问器,接下来我构建了一个名为AssemblyDynamicLoader的类,它内部封装了RemoteLoader类&lt;/p&gt;&lt;p&gt;的操作.&lt;/p&gt;    &lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AssemblyDynamicLoader&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;private &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;appDomain;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;private &lt;/span&gt;&lt;span style="color: #678cb1"&gt;RemoteLoader &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;remoteLoader;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AssemblyDynamicLoader()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomainSetup &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;setup &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomainSetup&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationName &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;ApplicationLoader&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;    &lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationBase &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;BaseDirectory;  &lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;PrivateBinPath &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Path&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Combine(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;BaseDirectory, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;private&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CachePath &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationBase;&lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ShadowCopyFiles &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; &lt;br/&gt;            setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ShadowCopyDirectories &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;setup&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ApplicationBase;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SetShadowCopyFiles();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;appDomain &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateDomain(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;ApplicationLoaderDomain&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, setup);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;String &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;name &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Assembly&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetExecutingAssembly()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetName()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FullName;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;remoteLoader &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;RemoteLoader&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;appDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateInstanceAndUnwrap(name, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;RemoteLoader&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FullName);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LoadAssembly(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;assemblyFile)&lt;br/&gt;        {&lt;br/&gt;            remoteLoader&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LoadAssembly(assemblyFile);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T GetInstance&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;typeName) &lt;/span&gt;&lt;span style="color: #93c763"&gt;where &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T : &lt;/span&gt;&lt;span style="color: #93c763"&gt;class&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(remoteLoader &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;return &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;remoteLoader&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetInstance&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;T&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(typeName);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ExecuteMothod(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;typeName, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;methodName)&lt;br/&gt;        {&lt;br/&gt;            remoteLoader&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ExecuteMothod(typeName, methodName);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Unload()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;try&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(appDomain &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Unload(&lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;appDomain);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;appDomain &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;catch &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;CannotUnloadAppDomainException &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ex)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #93c763"&gt;throw &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ex;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;这样我们每次都是通过AssemblyDynamicLoader类进行跨域的访问.&lt;/p&gt;            &lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SetShadowCopyFiles();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;appDomain &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateDomain(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;ApplicationLoaderDomain&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, setup);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;String &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;name &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Assembly&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetExecutingAssembly()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetName()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FullName;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;remoteLoader &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;RemoteLoader&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;appDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateInstanceAndUnwrap(name, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;RemoteLoader&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;FullName);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;通过我们前面构造的一个AppDomainSetup,构建了一个我们所需的AppDomain,并且在这个appDomain中构建了&lt;/p&gt;&lt;p&gt;一个RemoteLoader类的实例(此时该实例已具备跨域访问能力,也就是说我们在主域能获取子域内部的数据信息).目前RemoteLoader只提供了少数的几个方法.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;跨域操作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下面,我们就模拟一次&amp;quot;插件式&amp;quot;的跨域操作.首先我们构造了一个窗体,其有以下元素.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957436116.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957443824.png" width="320" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;选择程序集路径之后,加载程序集,然后就触发程序集指定类型(通过配置获取)的特定操作.这里我们定义了一个公共接口,它是所有&amp;quot;插件&amp;quot;操作的主要入口了.&lt;/p&gt;    &lt;span style="color: #93c763"&gt;public interface &lt;/span&gt;&lt;span style="color: #8c8cb4"&gt;IPlug&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run();&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;随后定义了一个实现该接口的类.&lt;/p&gt;    &lt;span style="color: #f1f2f3"&gt;[&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Serializable&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;]&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="color: #678cb1"&gt;ShowHelloPlug &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;: IPlug&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run()&lt;br/&gt;        {&lt;br/&gt;            MessageBox&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Show(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Hello World...&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;这个&amp;quot;插件&amp;quot;的工作很简单.仅仅弹出一个对话框,说声&amp;quot;Hello World…&amp;quot;,接下来将其编译成一个dll.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957459298.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957473211.png" width="665" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;回到界面,选择刚才编译的Dll,然后直接加载.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957489524.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957505422.png" width="318" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;到这里,我们的工作完成了一半了.呼呼.OK.我们的需求发生了变化,不再是弹出Hello World了.而时候弹出Hi,I'm Kinsen,我们修改刚才的子类,并再编译一次.再将Dll替换刚才的Dll,这次,Dll没有没锁定(因为我们前面启用了ShadowCopyFiles.).再加载一下程序集,你会发现结果并不是&amp;quot;Hi,I'm Kinsen&amp;quot;,而是&amp;quot;Hello World..&amp;quot;为什么会这样呢?这时候,借助SOS的力量(前面有SOS结果).&lt;/p&gt;&lt;p&gt;我们发现Domain1(Default Domain)和Domain2(新创建Domain)都引用了程序集ShowHelloPlug.DLL,但是两个引用的Dll地址却不相同,这是因为启用了ShadowCopyFiles,它们加载的都是各自程序集的备份,我们根据Domain2的Assembly地址查看ShowHelloPlug的编译代码.&lt;/p&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;011&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpmt &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c40ac     &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c40ac &lt;/span&gt;&lt;span style="color: #93c763"&gt;is &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;not a MethodTable&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;011&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpmd &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c40ac     &lt;br/&gt;Method Name:  Plug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ShowHelloPlug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run()&lt;br/&gt;Class:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;046812&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;b4&lt;br/&gt;MethodTable:  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c40bc&lt;br/&gt;mdToken:      &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06000001&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Module:       &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00f&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;c3adc&lt;br/&gt;IsJitted:     no&lt;br/&gt;CodeAddr:     ffffffff&lt;br/&gt;Transparency: Critical&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;从IsJitted为no可以看出,该程序集并没有被调用,那调用的是谁?我们再次查看Domain1(Default Domain&lt;/p&gt;&lt;p&gt;)中的ShowHelloPlug.&lt;/p&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;:&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;011&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; !&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;dumpmd &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001f8240      &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Method Name:  Plug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ShowHelloPlug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Run()&lt;br/&gt;Class:        &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;004446e4&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;MethodTable:  &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001f8250&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;mdToken:      &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;06000001&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Module:       &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;001f7d78&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IsJitted:     yes&lt;br/&gt;CodeAddr:     &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;00430d&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;e0&lt;br/&gt;Transparency: Critical&lt;br/&gt;&lt;/span&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;已知每个AppDomain都有自己的堆栈信息,各自不互相影响,所以,当我们在主域中获取到了子域中的数据,并非新建一个指向该实例的引用,而是在自己的堆栈上开辟出一块空间&amp;quot;深度拷贝&amp;quot;该实例,那么必然就达不到我们我需的结果.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;子域内部调用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;那么为了达到我们预期的效果,我们必须在子域内部执行我们所需的操作(调用),所以在RemoteLoader类中增加了一个Execute方法&lt;/p&gt;        &lt;span style="color: #93c763"&gt;public void &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ExecuteMothod(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;typeName, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;methodName)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;if &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(_assembly &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;== &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;type &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;_assembly&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType(typeName);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #93c763"&gt;var &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;obj &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Activator&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateInstance(type);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Action&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;lambda &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Action&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Call(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Constant(obj), type&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetMethod(methodName)), &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;            lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Compile()();&lt;br/&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;此处我暂时只想到了利用反射调用,这样的代价就是调用所需消耗的资源更多,效率低下.目前还没有&lt;/p&gt;&lt;p&gt;想出较好的解决方案,有经验的童鞋欢迎交流.&lt;/p&gt;&lt;p&gt;这样外部的调用就变成以下&lt;/p&gt;&lt;span style="color: #f1f2f3"&gt;loader &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="color: #93c763"&gt;new &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AssemblyDynamicLoader&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;br/&gt;loader&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LoadAssembly(txt_dllName&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Text);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #66747b"&gt;//var obj = loader.GetInstance&amp;lt;IPlug&amp;gt;(&amp;quot;Plug.ShowHelloPlug&amp;quot;);&lt;br/&gt;//obj.Run();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;loader&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ExecuteMothod(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Plug.ShowHelloPlug&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Run&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;p&gt;现在在将Dll替换,结果正常.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957514244.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201108/201108010957538473.png" width="386" height="333" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;尾声&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;做&amp;quot;插件式&amp;quot;开发,除了利用AppDomain之外,也有童鞋给出了另一种解决方案,也就是在加载Dll的时候,先将Dll在内存中复制一份,这样原来的Dll也就不会被锁定了.详见&lt;a href="http://www.cnblogs.com/zhuweisky/archive/2005/12/30/308218.html"&gt;插件的“动态替换”&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;以上实例本人皆做过实验,但可能还存在一定不足或概念错误,若有不当之处,欢迎各位童鞋批评指点.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更多&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;&lt;a href="http://www.cnblogs.com/wayfarer/archive/2004/09/29/47896.html"&gt;通过应用程序域AppDomain加载和卸载程序集&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://zh-cn.w3support.net/index.php?db=so&amp;amp;id=574708"&gt;什么是的AppDomain&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/2123459.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/08/01/2123459.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2011/01/16/1936677.html</id><title type="text">青梅煮酒论C#:Specification pattern</title><summary type="text">Specification模式早在3个多月前,阅读一个开源博客的时候便接触到了.但并没多少深入.最近,抽空将其好好研究了一番,果然,其魅力的确能让你回味无穷,那现在,就让我们零距离接触Specification模式吧! 何为Specification? Specification,中文有翻译规格,虽然有很多争论,但目前叫得最多的,还是规格模式,既然说到了规格,那其作用估计就能不言而喻了. Sp...</summary><published>2011-01-16T05:56:00Z</published><updated>2011-01-16T05:56:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2011/01/16/1936677.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2011/01/16/1936677.html"/><content type="html">&lt;p&gt;Specification模式早在3个多月前,阅读一个开源博客的时候便接触到了.但并没多少深入.最近,抽空将其好好研究了一番,果然,其魅力的确能让你回味无穷,那现在,就让我们零距离接触Specification模式吧!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;何为Specification?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Specification,中文有翻译规格,虽然有很多争论,但目前叫得最多的,还是规格模式,既然说到了规格,那其作用估计就能不言而喻了.&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p align="left"&gt;Specification模式的作用是构建可以自由组装的业务逻辑元素.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;上面这句话可以完整的概括Specification的作用,但第一次理解或许会有些许困难,没关系,可以这么理解,Specification模式起作用的,是每个Specification类,每一个Specification类,可以看成一张&amp;quot;规格书&amp;quot;,或者说是某种&amp;quot;规格约束&amp;quot;,而通过这张&amp;quot;规格书&amp;quot;或者&amp;quot;规格约束&amp;quot;,我们能得到我们所想要的这种&amp;quot;规格&amp;quot;的对象,并且,不同的规格是可以组合起来,形成新的规格.如果还不明白.好吧,您知道乐高积木吧?我们形象的把每个规格想象成一个不同的乐高模型,而不同的乐高模型组合在一起了,就形成了新的模型,以达到我们所需的结果.&lt;/p&gt;  &lt;p&gt;&lt;img alt="specification-pattern-uml" src="http://upload.wikimedia.org/wikipedia/commons/4/46/Specification_UML.png" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;如何实现Specification&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;了解了什么是Specification,那接下去,您肯定会问,该怎么实现?其实很简单,Specification模式里面只有一个方法,我们有了&amp;quot;规格书&amp;quot;,下一步,当然就是从不同的对象中得到符合&amp;quot;规格书&amp;quot;的对象,那这个匹配的过程就形成了一个动作抽象.IsSatisfiedBy就是帮助你从&amp;quot;对象堆&amp;quot;中找到你所需&amp;quot;规格&amp;quot;的动作.如此.我们可以实现的Specification接口如下&lt;/p&gt;  &lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public interface &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate);&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;但是,一般的Specification都提供了几个基本的组合操作,例如Add,Or,Not,可以利用它们分别组合成一个新的Specification.经过初步改动,最后ISpecification如下&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public interface &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate);&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Add(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other);&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Or(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other);&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Not();&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;为了重用可复用逻辑,我们定义了一个抽象类CompositeSpecification&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public abstract class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CompositeSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;: &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public abstract bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate);&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Add(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;AddSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;, other);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Or(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;OrSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;, other);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Not()&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;NotSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;并定义了基本的几个&amp;quot;组合&amp;quot;类&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;AddSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;: &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CompositeSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;AddSpecification(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one, &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other;&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public override bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate) &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;OrSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;: &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CompositeSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;OrSpecification(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one, &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other;&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public override bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate) &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;|| &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;NotSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;: &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;CompositeSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;NotSpecification(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one;&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public override bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;最后,我们定义我们所需要的规格,在这里,我们定义一个基数规格与正数规格&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;OddSpecification &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;: ComsptionSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public override bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;candidate)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;% &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2 &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;;&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;PlusSpecification &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;: ComsptionSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public override bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;candidate)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;;&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;现在,万事俱备,只欠东风.就差你来调用了.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Main(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;[] args)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;items &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Enumerable&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Range(&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;-&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;10&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;oddSpec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;OddSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;MoreCandidate(oddSpec);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;i &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;in &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;items&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Where(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(it)))&lt;br/&gt;            {&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;WriteLine(i);&lt;br/&gt;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;static &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;MoreCandidate(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;plusSpec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;PlusSpecification&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Or(plusSpec);&lt;br/&gt;&lt;br/&gt;        }&lt;/span&gt;&lt;p&gt;这个逻辑还是十分简单的.我们先定义了一个基数规格,后面我们发现这个规格不足以得到我们所需要的,我们想OrWhere它是正数.于是,我们&amp;quot;组合&amp;quot;成了一个新的规格.结果&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201101/201101161356166375.gif"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201101/201101161356206738.gif" width="451" height="295" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这里应该注意的是.在这里我们提供了一种OrWhere功能,这是在一条条件的基础上再匹配多另一条条件,有同学说直接Where(it=&amp;gt;it%2!==0||it&amp;gt;0)就可以了.必须指明的是,后者就变成了一个条件.你把两个条件合并写死成一个条件了.不是将其&amp;quot;组合&amp;quot;成一个新条件.就像你用乐高堆砌出一架跑车模型和直接浇铸出一架跑车模型的概念是完全不同的.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;优雅实现&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;虽然我们完美的实现了Specification模式,但是,聪明的你应该能看到它的弊病了.就是传统的Specification模式实在是太&amp;quot;重量级&amp;quot;了,如果你想实现一个新的&amp;quot;规格&amp;quot;,那么你必须需要新增一个新的Specification类.这样下来,最终我们的类库中必然堆积了许许多多的Specification类.既然如此,有没有什么方法可以让其的实现变得更加的轻易?答案是肯定的.我们再一次解析Specification模式,其重点是IsSatisfiedBy方法.遵守我们一贯的思路,改进必然是在重点实现处.于是,一种优雅的实现便诞生了.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public interface &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate);&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;我们还是必须定义一个ISpecification接口.与前面不同的是,该接口里不再有Add,Or,Not等方法.为何?后面讲解.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Specification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;: &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;private &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;bool&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;m_isSatisfiedBy;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public bool &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(T candidate)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;m_isSatisfiedBy(candidate);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Specification(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T, &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;bool&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;isSatisfiedBy)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;m_isSatisfiedBy &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;isSatisfiedBy;&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;接下来,我们定义了Specification&amp;lt;T&amp;gt;类继承了ISpecification&amp;lt;T&amp;gt;接口,此处要注意的是.在其构造函数中.我们传入了一个委托,然后,将该委托赋给私有变量m_isSatisfiedBy,最后.IsSatisfiedBy方法只是简单的调用了该Func,这实际上了也是依赖了注入.只不过我们注入的是一种特殊的类,委托.如此一来,只要我们需要新的&amp;quot;规格&amp;quot;时,只需要传入相应不同委托便可以实现.那么传统实现中Add,Or,Not等组合实现该如何实现.在次我们利用C#3.5的特性--扩展方法.我们实现了一个扩展类,并将所有的&amp;quot;组合&amp;quot;方法变成扩展方法.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;SpecificationExtensions&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Add&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one, &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Specification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate) &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate));&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Or&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one, &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Specification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate) &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;|| &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate));&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Not&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Specification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; !&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(candidate));&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;至于为什么要生成一个新的扩展类,并将方法提取出来.站在面向对象的角度上并不能说哪种更&amp;quot;面向对象&amp;quot;,实际上,并没有纯粹意义上的&amp;quot;面向对象标准&amp;quot;.只是我们习惯上会不知不觉把一些&amp;quot;良好的面向对象实践&amp;quot;当成&amp;quot;标准&amp;quot;,开发者站在不同的位置上,看到的东西,细节必然不同.如此,&amp;quot;面向对象&amp;quot;的结果也就不同.老赵说得很对(个人观点),当我们执行Add,Or,Not等操作的时候,并不是对象本身去Add,Or,Not,一般比较而言,更多的我们不会拿自己与别人比较,这样未免有失公正,而是有个&amp;quot;第三方&amp;quot;,由它来进行比较,拿&amp;quot;你&amp;quot;和&amp;quot;他&amp;quot;进行比较.这里,我们也是借鉴现实生活的抽象,完成类的抽象.至此,这个轻量级的实现已经完成.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Main(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;[] args)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;items &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Enumerable&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Range(&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;-&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;10&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;oddSpec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Specification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;% &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2 &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;MoreCandidate(oddSpec);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;i &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;in &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;items&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Where(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;IsSatisfiedBy(it)))&lt;br/&gt;            {&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;WriteLine(i);&lt;br/&gt;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;static &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;MoreCandidate(&lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #8c8cb4"&gt;ISpecification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;plusSpec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;new &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Specification&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Or(plusSpec);&lt;br/&gt;&lt;br/&gt;        }&lt;/span&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/kongyiyun/201101/201101161356235739.gif"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/kongyiyun/201101/201101161356242807.gif" width="445" height="290" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;轻量级实现&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;即使前面的实现已经足够&amp;quot;轻量级&amp;quot;,但对于懒人而言却往往还是不够的.那么是否还有更&amp;quot;懒&amp;quot;的实现方法?答案是肯定的.再一想一下,Specification模式的实现其实就是IsSatisfiedBy方法的实现.那么我们直接把IsSatisfiedBy提取出来,形成一种更&amp;quot;懒&amp;quot;的实现.聪明的你应该想到了.答案就是利用委托.我们新建了一个委托.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public delegate bool &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(T candidate);&lt;/span&gt;&lt;p&gt;命名为Spec完全只是为了说明这是一个Specification,它接受一个参数,并返回一个布尔值.只不过这种实现是在太过于简单.简单到没有提供一定的约束.所以,必须遵守一种约定,这也是约定大于约束的一种实现.和第二种实现同理,我们还实现一个SpecificationExtension类.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static class &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;SpecExtensitions&lt;br/&gt;    &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;{&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Add&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one(candidate) &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other(candidate);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Or&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one, &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one(candidate) &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;|| &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;other(candidate);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;public static &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Not&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;this &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;T&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;candidate &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; !&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;one(candidate);&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;p&gt;这样一来.我们就实现了一套&amp;quot;超轻量级&amp;quot;的Specification实现.&lt;/p&gt;&lt;span style="background: #22282a; color: white"&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;static void &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Main(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;string&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;[] args)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;items &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Enumerable&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Range(&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;-&lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;5&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;, &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;10&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;oddSpec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;% &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;2 &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;!= &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;= &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;MoreCandidate(oddSpec);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;foreach &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;(&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;var &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;i &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;in &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;items&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Where(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec(it)))&lt;br/&gt;            {&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;WriteLine(i);&lt;br/&gt;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;static &lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;MoreCandidate(&lt;/span&gt;&lt;span style="background: #22282a; color: #678cb1"&gt;Spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;int&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="background: #22282a; color: #93c763"&gt;return &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;spec&lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;Or(it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;it &lt;/span&gt;&lt;span style="background: #22282a; color: #e8e2b7"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #22282a; color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="background: #22282a; color: white"&gt;);&lt;br/&gt;&lt;br/&gt;        }&lt;/span&gt;&lt;p&gt;&lt;strong&gt;结语&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Specification模式的应用能很大程度上减少我们的工作量,目前应用的比较多的是在LINQ2SQL上,查询数据时采用不同的Specification从而获取你所需要的数据.MVC下的Reposity+Specification能大大提高项目的扩展性.不过,世上没有万能的灵丹妙药,如一把双刃剑,能伤人,也能伤己.任何一种模式的滥用都会造成不良的影响.所以,只有该需要它的时候使用它才是最合理的.那什么时候该使用呢?当你发现你的条件实在是太过千变万化,当你需要OrWhere,当你.....(欢迎你留下你认为合适的时候,:-) )&lt;/p&gt;&lt;p&gt;&lt;strong&gt;扩展阅读&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Specification_pattern"&gt;Specification模式&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;依赖注入（控制反转）&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jeffreyzhao/archive/2009/09/15/specification-pattern-in-csharp-practice.html"&gt;趣味编程：C#中Specification模式的实现&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jeffreyzhao/archive/2009/09/28/specification-pattern-in-csharp-practice-answer-1.html"&gt;趣味编程：C#中Specification模式的实现（参考答案 - 上）&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jeffreyzhao/archive/2009/09/29/specification-pattern-in-csharp-practice-answer-2.html"&gt;趣味编程：C#中Specification模式的实现（参考答案 - 下）&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/1936677.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/01/16/1936677.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kongyiyun/archive/2010/12/14/1905953.html</id><title type="text">应届毕业生面试失败之谈</title><summary type="text">即将毕业,学校里也不断的施加压力找工作,找单位实习.身边的同学也一个接一个的实习了.压力就更大了.每天都形成了一个习惯,一开机就打开51job看看有没适合自己的单位. 经过好几周挑选.发了10多份简历,却没一份回信.那个焦急啊.迫不得已.只能打电话联系了..今天联系了一家公司.问是否还需要asp.net程序员.他们说要.问到应届毕业生能否实习时.说到实习的话可能有一定问题.我就说已经有了两年的.n...</summary><published>2010-12-14T10:34:00Z</published><updated>2010-12-14T10:34:00Z</updated><author><name>空逸云</name><uri>http://www.cnblogs.com/kongyiyun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kongyiyun/archive/2010/12/14/1905953.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kongyiyun/archive/2010/12/14/1905953.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 即将毕业,学校里也不断的施加压力找工作,找单位实习.身边的同学也一个接一个的实习了.压力就更大了.每天都形成了一个习惯,一开机就打开51job看看有没适合自己的单位.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 经过好几周挑选.发了10多份简历,却没一份回信.那个焦急啊.迫不得已.只能打电话联系了..今天联系了一家公司.问是否还需要asp.net程序员.他们说要.问到应届毕业生能否实习时.说到实习的话可能有一定问题.我就说已经有了两年的.net开发经验.对方听到两年就说可以.那就过来面试看看吧.于是就下午过去了.而且也想看看宝安(深圳)的环境.该公司的要求如下:&lt;/p&gt;  &lt;p&gt;1、 2年以上ASP.NET编程经验（WEB开发）    &lt;br /&gt;2、 熟练使用VS.NET2005/2008 开发工具     &lt;br /&gt;3、 熟悉中小型网站的开发模式和流程     &lt;br /&gt;4、 熟悉Javascript、Ajax开发,熟悉DIV+CSS布局     &lt;br /&gt;5、 熟悉SQL SERVER数据库，能熟练进行数据库编程     &lt;br /&gt;6、 具有大型网站项目开发经验者优先     &lt;br /&gt;素质要求：     &lt;br /&gt;1、较强的逻辑思维能力、学习能力，有良好的沟通和团队协作能力，具备独立完成工作能力，能快速适应新的工作环境     &lt;br /&gt;2、具备高度的责任心，有诚实守信、刻苦钻研和吃苦耐劳精神&lt;/p&gt;  &lt;p&gt;恩,基本都信心满满的就过去了.坐了一个小时的车.终于到了.一见面.那个负责人给我的感觉就是对应聘者(我),或者说对应聘这件事不太重视吧!一见面就问我有没带简历.我说,是web版的.打印出来就没有原先的风格了,再过去之前,我发了两次简历给他.但是却一次都没看.令人心寒..他说没关系.视觉呈现没所谓,就叫一个文员MM打印下来.粗略浏览了一下.说,刚刚毕业,算法应该不错,给几道题你做..我瞬间就急了.想说,我对算法没多大研究,主要是面向对象/设计模式......还没来得及开口,人走了..回来拿了一张A4纸,正反两页都是题目.说你先做着,说完又离开了.一看题目.我傻眼了.满页的SQL题目..偏偏对SQL并不是很熟悉,普通的查询还写得出来.但是自从LINQ出现后.再也没碰过T-SQL.更别说复杂查询了..第一道题是跨表查询,第二道是3表查询.第三道是递归查询.我承认.我很菜,对SQL本来就不多使用.并且现在还是跨表查询..T-SQL是写不出来了.算了,用LINQ实现吧.用LINQ实现还是没什么难度的.基本上查找的数据都能得到,只是第三道没做过,一时也没什么想法.往下是两道正则表达式的题目.IP和电话号码.用简单的实现搞定了.翻页.三道"算法"题,应该能算算法吧.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第一道是写个方法,该方法传入两个参数,第一个是浮点型,第二个是整数,要求根据把该浮点数的第N位小数位四舍五入..并且不使用.Net的Math类.一时之间没什么想法.第二道是求22/7的小数点后300位数字,要求递归实现..递归实现不出.直接就ToString然后截取了.第三道忘记了.但是实现挺简单的.往后是要求实现单例模式.OK.搞定.再来是给一个方法,该方法有个Lock.问会不会死锁..感觉不会发生死锁,在下就是要用Ajax实现截取一个RSS的内容,并且指定用HttpXMLRequest实现..完全忘记那几个兼容的object了.JQ用多了的坏处啊.往会一看,挂了N题了.再下就是问Remoting和WebServices的区别和应用.Remoting没用过.不知道.对WebService有一点点使用心得吧.但是占的比例少得可怜.往下就叫你说说自己用过的MVC框架和实体框架.这个比例.不想说了.请注意.都是答题的形式写的.不是问答.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一看时间,已经快4点了.在不走,回到学校估计6点多了.叫那个负责人..敲了门,示意做完了.他点头.我回去继续等.还要等了个10多分钟才出来.在这10多分钟里面纠结了N久.是不是该直接离开,估计不可能留下来了.负责人出来后也就是初略的看了一下答的题..跟他说对T-SQL没深入.就用LINQ实现了.反应不强力.还是漫不经心的看着.我看着就觉得没戏了.然后就跟我说他们公司主要是SQL方面应用比较多.一个项目下来几百个存储过程都有...然后就说实习的话要求很低之类的.说住的地方远不适合实习之类的...然后就说以后有机会再合作之类的...我没多说.离开了.从头到尾没说过一点Web方面的东西.唉.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这次学到一点东西..临近毕业,心态就更显着急了.每天逛招聘网站.但招聘网站找应届的少得可怜,大专的就更少了..以后找工作,投简历.要过去面试之前最好先问一下他们对哪方面的技术看得比较重.这样就不至于发生今天这种牛头不对马嘴的事了..而且要做好准备吧.不单单是平时用的东西,市场需要的技术都要适当的了解一下.这样才会大大的提高成功率吧!末了.不知有没有在深圳工作的前辈,需要找工的呢?有的话可以联系我,给个机会我试试.专注于.Net开发.多谢各位前辈的关照了.也看能否给其他我这种状态的同学提供一个机会.其实.我们并不比外面的程序员差多少!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kongyiyun/aggbug/1905953.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2010/12/14/1905953.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
