<?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/32101/rss</id><updated>2012-03-06T07:45:29Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/32101/rss"/><entry><id>http://www.cnblogs.com/DragonInSea/archive/2010/06/07/1753022.html</id><title type="text">《企业考试系统》项目实践（04）：通用工具类库之配置文件操作工具</title><summary type="text">摘要：对于应用程序的配置方法进行说明，并使用自定义的XML格式的文件做为《考试系统》的配置文件。   应用程序配置的方法 对于应用程序（无论是Windows应用程序还是Web应用程序）...</summary><published>2010-06-07T02:50:00Z</published><updated>2010-06-07T02:50:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/07/1753022.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/07/1753022.html"/><content type="html">&lt;p&gt;摘要：对于应用程序的配置方法进行说明，并使用自定义的XML格式的文件做为《考试系统》的配置文件。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;应用程序配置的方法&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;对于应用程序（无论是Windows应用程序还是Web应用程序），其应用程序配置非常重要。现今在开发中有一种说法，叫“配置驱动”，其含义是使用配置来驱动整个应用程序的运行。通常将应用程序运行过程中可能会变化的（如对于数据库连接的连接字符串），需要保存的数据（如打开或保存文件的历史记录）均应做为配置保存。&lt;/p&gt;  &lt;p&gt;对于应用程序的配置，其基本特点有：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;可持久化，即当应用程序重新启动或计算机重新启动后，配置应仍然存在。 &lt;/li&gt;    &lt;li&gt;更改配置的内容，在应用程序不重新编译的前提下可以更改应用程序执行的内容（如多语言版本的应用程序，更改其显示的语言，即更改配置，应用程序不需要重新编译即可以更改其显示的语言） &lt;/li&gt; &lt;/ul&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;ul&gt;   &lt;li&gt;二进制文件      &lt;br /&gt;以二进制方式保存配置的数据，其优点在于读写的速度快，更灵活；其缺点是更改不方便（但需要对于配置进行保密时可以是优点），操作较为麻烦。例如一些游戏的存档文件是以二进制方式保存的，一些所有的存档修改器就是将其二进制位的数值进行更改，如某位置的两个字节表示的是生命值，将0001更改为00FF便将生命值是1提升到256。另外对于二进制的数据还可以方便的对于进行加密或压缩操作。 &lt;/li&gt;    &lt;li&gt;纯文本INI格式的文件      &lt;br /&gt;纯文本格式的配置文件的优点在于便于修改，且与操作系统、编程语言无关。早期的操作系统或应用程序的配置采用的是纯文本的INI格式，例如Windows XP、Windows Server 2003及以前的操作系统C盘根目录中有一个系统隐藏文件boot.ini，其内容如下：       &lt;div&gt;       &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;         &lt;span style="color: #606060"&gt;   1:&lt;/span&gt; [boot loader]        &lt;span style="color: #606060"&gt;   2:&lt;/span&gt; timeout=30        &lt;span style="color: #606060"&gt;   3:&lt;/span&gt; default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS        &lt;span style="color: #606060"&gt;   4:&lt;/span&gt; [operating systems]        &lt;span style="color: #606060"&gt;   5:&lt;/span&gt; multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=&amp;quot;Windows Server 2003, Standard&amp;quot; /noexecute=optout /fastdetect      &lt;/div&gt;    &lt;/div&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 在.Net Framework中没有对其进行读写操作的方法，可以将其按纯文本读取，按字符串进行拆分。   &lt;br /&gt;&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;纯文本XML格式的文件     &lt;br /&gt;XML文件是现在应用程序中采用比较多的配置文件的保存格式，其优点在于格式清晰，可以对于内容进行相应的约束（Xml Schema或DTD）。对于XML格式的配置文件的操作大多采用XmlDocument对象进行操作。本系统便是采用这种方式操作配置文件。 &lt;/li&gt;  &lt;li&gt;序列化文件     &lt;br /&gt;序列化可以看作生成配置文件的一种方法，可以将需要保存的数据封装到一个或多个可序列化的类型中，将其实例序列化为二进制格式或SOAP格式的文件，将此文件做为配置文件，在读取配置时，直接反序列化这个文件，恢复实例即可。 &lt;/li&gt;  &lt;li&gt;.Net应用程序配置文件     &lt;br /&gt;在.Net应用程序中的“应用程序配置文件”，即App.config或web.config文件，其对于用户的配置操作有两种，一种是AppSetting节，另一种是“设置”。两种方法各有优点，在Framework 2.0以后，大多数使用“设置”。 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注册表&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;即将需要保存的数据使用RegistryKey对象，保存到系统注册表中。但不建议使用。（避免产生大量的注册表垃圾）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Web应用程序中的Cookie、Profile&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;将一些信息保存在Cookie或Profile中，这种在Web应用程序中常见，特别是Cookie。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;将配置信息保存在数据库中。例如BBS系统中的用户的配置等。&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;《企业考试系统》配置文件工具类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;《企业考试系统》的配置采用XML格式的配置文件，其配置文件的格式如下：&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;根节点为configurations &lt;/li&gt;  &lt;li&gt;根节点的每一个config子节点表示一个配置项，其中包含三个属性：key表示配置项的名，value表示配置项的值，isCrypt表示配置项的值是否加密 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;定义一个通用的类型，用来操作此配置文件的读写：&lt;/p&gt;&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; max-height: 600px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #006080"&gt;using System;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #006080"&gt;using System.Xml;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #006080"&gt;using CommonUtilityLibrary.SymmetricCryptography;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   4:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;   5:&lt;/span&gt; namespace CommonUtilityLibrary&lt;span style="color: #cc6633"&gt;.Configuration&lt;/span&gt;    &lt;span style="color: #606060"&gt;   6:&lt;/span&gt; {    &lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// 配置文件操作工具类&lt;/span&gt;    &lt;span style="color: #606060"&gt;   9:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;![CDATA[&lt;/span&gt;    &lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///     配置文件的格式&lt;/span&gt;    &lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///     &amp;lt;? xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///     &amp;lt;configurations&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///         &amp;lt;!--&lt;/span&gt;    &lt;span style="color: #606060"&gt;  14:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///             每个配置项对应一个config节点，每个节点中&lt;/span&gt;    &lt;span style="color: #606060"&gt;  15:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///             key：对应配置项的名&lt;/span&gt;    &lt;span style="color: #606060"&gt;  16:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///             value：对应配置项的值&lt;/span&gt;    &lt;span style="color: #606060"&gt;  17:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///             isCrypt：对应配置项是否加密，值为True/False&lt;/span&gt;    &lt;span style="color: #606060"&gt;  18:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///         --&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  19:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///         &amp;lt;config key=&amp;quot;&amp;quot; value=&amp;quot;&amp;quot; isCrypt=&amp;quot;&amp;quot; /&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  20:&lt;/span&gt;     &lt;span style="color: #008000"&gt;///     &amp;lt;/configurations&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  21:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// ]]&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  22:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  23:&lt;/span&gt;     public sealed class ConfigurationUtility    &lt;span style="color: #606060"&gt;  24:&lt;/span&gt;     {    &lt;span style="color: #606060"&gt;  25:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  26:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 配置文件的文件名&lt;/span&gt;    &lt;span style="color: #606060"&gt;  27:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  28:&lt;/span&gt;         &lt;span style="color: #006080"&gt;private readonly string configFileName;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  29:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  30:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  31:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// XmlDocument对象&lt;/span&gt;    &lt;span style="color: #606060"&gt;  32:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  33:&lt;/span&gt;         &lt;span style="color: #006080"&gt;private readonly XmlDocument document;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  34:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  35:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  36:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 加密工具类&lt;/span&gt;    &lt;span style="color: #606060"&gt;  37:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  38:&lt;/span&gt;         &lt;span style="color: #006080"&gt;private readonly SymmetricCryptographyUtility cryptUtility;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  39:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  40:&lt;/span&gt;         #region 配置文件中各配置项节点的名称    &lt;span style="color: #606060"&gt;  41:&lt;/span&gt;         private const string ROOT_NODE_NAME &lt;span style="color: #006080"&gt;= &amp;quot;configurations&amp;quot;;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  42:&lt;/span&gt;         private const string CONFIG_NODE_NAME &lt;span style="color: #006080"&gt;= &amp;quot;config&amp;quot;;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  43:&lt;/span&gt;         private const string KEY_ATTRIBUTE_NAME &lt;span style="color: #006080"&gt;= &amp;quot;key&amp;quot;;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  44:&lt;/span&gt;         private const string VALUE_ATTRIBUTE_NAME &lt;span style="color: #006080"&gt;= &amp;quot;value&amp;quot;;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  45:&lt;/span&gt;         private const string ISCRYPT_ATTRIBUTE_NAME &lt;span style="color: #006080"&gt;= &amp;quot;isCrypt&amp;quot;;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  46:&lt;/span&gt;         #endregion    &lt;span style="color: #606060"&gt;  47:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  48:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  49:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 构造方法，使用自定义的加密工具类实例&lt;/span&gt;    &lt;span style="color: #606060"&gt;  50:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  51:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;configFileName&amp;quot;&amp;gt;配置文件的文件名&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  52:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;utility&amp;quot;&amp;gt;加密工具类实例&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  53:&lt;/span&gt;         public ConfigurationUtility(    &lt;span style="color: #606060"&gt;  54:&lt;/span&gt;             string configFileName, SymmetricCryptographyUtility utility)    &lt;span style="color: #606060"&gt;  55:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  56:&lt;/span&gt;             this&lt;span style="color: #cc6633"&gt;.configFileName&lt;/span&gt; &lt;span style="color: #006080"&gt;= configFileName;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  57:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  58:&lt;/span&gt;             cryptUtility &lt;span style="color: #006080"&gt;= utility;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  59:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  60:&lt;/span&gt;             document = new XmlDocument();    &lt;span style="color: #606060"&gt;  61:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  62:&lt;/span&gt;             document&lt;span style="color: #cc6633"&gt;.Load&lt;/span&gt;(configFileName);    &lt;span style="color: #606060"&gt;  63:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  64:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  65:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  66:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 查找配置文件中的配置项&lt;/span&gt;    &lt;span style="color: #606060"&gt;  67:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  68:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;配置项的名&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  69:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;返回相应配置项的XmlNode，如没有相应节点，则返回null&amp;lt;/returns&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  70:&lt;/span&gt;         private XmlNode GetXmlNodeByKey(string key)    &lt;span style="color: #606060"&gt;  71:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  72:&lt;/span&gt;             document&lt;span style="color: #cc6633"&gt;.Load&lt;/span&gt;(configFileName);    &lt;span style="color: #606060"&gt;  73:&lt;/span&gt;             XmlNode result &lt;span style="color: #006080"&gt;= null;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  74:&lt;/span&gt;             if (document != null)    &lt;span style="color: #606060"&gt;  75:&lt;/span&gt;                 foreach (XmlNode node in document[ROOT_NODE_NAME])    &lt;span style="color: #606060"&gt;  76:&lt;/span&gt;                 {    &lt;span style="color: #606060"&gt;  77:&lt;/span&gt;                     if (node&lt;span style="color: #cc6633"&gt;.NodeType&lt;/span&gt; != XmlNodeType&lt;span style="color: #cc6633"&gt;.Element&lt;/span&gt;)    &lt;span style="color: #606060"&gt;  78:&lt;/span&gt;                     &lt;span style="color: #006080"&gt;{    &lt;span style="color: #606060"&gt;  79:&lt;/span&gt;                         continue;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  80:&lt;/span&gt;                     }    &lt;span style="color: #606060"&gt;  81:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  82:&lt;/span&gt;                     if (node&lt;span style="color: #cc6633"&gt;.Attributes&lt;/span&gt;[KEY_ATTRIBUTE_NAME]&lt;span style="color: #cc6633"&gt;.Value&lt;/span&gt; == key)    &lt;span style="color: #606060"&gt;  83:&lt;/span&gt;                     {    &lt;span style="color: #606060"&gt;  84:&lt;/span&gt;                         result &lt;span style="color: #006080"&gt;= node;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  85:&lt;/span&gt;                         &lt;span style="color: #006080"&gt;break;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  86:&lt;/span&gt;                     }    &lt;span style="color: #606060"&gt;  87:&lt;/span&gt;                 &lt;span style="color: #006080"&gt;}    &lt;span style="color: #606060"&gt;  88:&lt;/span&gt;             return result;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  89:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  90:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  91:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  92:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 设置配置项（如配置项不存在则添加；如存在则修改）&lt;/span&gt;    &lt;span style="color: #606060"&gt;  93:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  94:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;配置项的名&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  95:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;配置项的值&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  96:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;isCrypt&amp;quot;&amp;gt;配置项是否加密&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  97:&lt;/span&gt;         public void SetConfiguration(string key, string value, bool isCrypt)    &lt;span style="color: #606060"&gt;  98:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  99:&lt;/span&gt;             if (string&lt;span style="color: #cc6633"&gt;.IsNullOrEmpty&lt;/span&gt;(key) || string&lt;span style="color: #cc6633"&gt;.IsNullOrEmpty&lt;/span&gt;(value))    &lt;span style="color: #606060"&gt; 100:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt; 101:&lt;/span&gt;                 throw new ArgumentNullException();    &lt;span style="color: #606060"&gt; 102:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt; 103:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 104:&lt;/span&gt;             if (isCrypt)    &lt;span style="color: #606060"&gt; 105:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt; 106:&lt;/span&gt;                 value = cryptUtility&lt;span style="color: #cc6633"&gt;.EncryptBase64String&lt;/span&gt;(value);    &lt;span style="color: #606060"&gt; 107:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt; 108:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 109:&lt;/span&gt;             XmlNode node = GetXmlNodeByKey(key);    &lt;span style="color: #606060"&gt; 110:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 111:&lt;/span&gt;             if (node != null)    &lt;span style="color: #606060"&gt; 112:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt; 113:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;// 修改配置项&lt;/span&gt;    &lt;span style="color: #606060"&gt; 114:&lt;/span&gt;                 node&lt;span style="color: #cc6633"&gt;.Attributes&lt;/span&gt;[VALUE_ATTRIBUTE_NAME]&lt;span style="color: #cc6633"&gt;.Value&lt;/span&gt; &lt;span style="color: #006080"&gt;= value;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 115:&lt;/span&gt;                 node&lt;span style="color: #cc6633"&gt;.Attributes&lt;/span&gt;[ISCRYPT_ATTRIBUTE_NAME]&lt;span style="color: #cc6633"&gt;.Value&lt;/span&gt; = isCrypt&lt;span style="color: #cc6633"&gt;.ToString&lt;/span&gt;();    &lt;span style="color: #606060"&gt; 116:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt; 117:&lt;/span&gt;             else    &lt;span style="color: #606060"&gt; 118:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt; 119:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;// 添加配置项&lt;/span&gt;    &lt;span style="color: #606060"&gt; 120:&lt;/span&gt;                 XmlElement element = document&lt;span style="color: #cc6633"&gt;.CreateElement&lt;/span&gt;(CONFIG_NODE_NAME);    &lt;span style="color: #606060"&gt; 121:&lt;/span&gt;                 element&lt;span style="color: #cc6633"&gt;.SetAttribute&lt;/span&gt;(KEY_ATTRIBUTE_NAME, key);    &lt;span style="color: #606060"&gt; 122:&lt;/span&gt;                 element&lt;span style="color: #cc6633"&gt;.SetAttribute&lt;/span&gt;(VALUE_ATTRIBUTE_NAME, value);    &lt;span style="color: #606060"&gt; 123:&lt;/span&gt;                 element&lt;span style="color: #cc6633"&gt;.SetAttribute&lt;/span&gt;(ISCRYPT_ATTRIBUTE_NAME, isCrypt&lt;span style="color: #cc6633"&gt;.ToString&lt;/span&gt;());    &lt;span style="color: #606060"&gt; 124:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 125:&lt;/span&gt;                 document[ROOT_NODE_NAME]&lt;span style="color: #cc6633"&gt;.AppendChild&lt;/span&gt;(element);    &lt;span style="color: #606060"&gt; 126:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt; 127:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 128:&lt;/span&gt;             document&lt;span style="color: #cc6633"&gt;.Save&lt;/span&gt;(configFileName);    &lt;span style="color: #606060"&gt; 129:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt; 130:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 131:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 132:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 获取配置项的值&lt;/span&gt;    &lt;span style="color: #606060"&gt; 133:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 134:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;配置项的名&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 135:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;返回配置项的值，如果配置项不存在，返回null&amp;lt;/returns&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 136:&lt;/span&gt;         public string GetConfiguration(string key)    &lt;span style="color: #606060"&gt; 137:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt; 138:&lt;/span&gt;             if (string&lt;span style="color: #cc6633"&gt;.IsNullOrEmpty&lt;/span&gt;(key))    &lt;span style="color: #606060"&gt; 139:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt; 140:&lt;/span&gt;                 throw new ArgumentNullException();    &lt;span style="color: #606060"&gt; 141:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt; 142:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 143:&lt;/span&gt;             XmlNode node = GetXmlNodeByKey(key);    &lt;span style="color: #606060"&gt; 144:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 145:&lt;/span&gt;             string result &lt;span style="color: #006080"&gt;= null;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 146:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 147:&lt;/span&gt;             if (node != null)    &lt;span style="color: #606060"&gt; 148:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt; 149:&lt;/span&gt;                 string value = node&lt;span style="color: #cc6633"&gt;.Attributes&lt;/span&gt;[VALUE_ATTRIBUTE_NAME&lt;span style="color: #006080"&gt;].Value;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 150:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 151:&lt;/span&gt;                 if (bool&lt;span style="color: #cc6633"&gt;.Parse&lt;/span&gt;(node&lt;span style="color: #cc6633"&gt;.Attributes&lt;/span&gt;[ISCRYPT_ATTRIBUTE_NAME]&lt;span style="color: #cc6633"&gt;.Value&lt;/span&gt;))    &lt;span style="color: #606060"&gt; 152:&lt;/span&gt;                 {    &lt;span style="color: #606060"&gt; 153:&lt;/span&gt;                     value = cryptUtility&lt;span style="color: #cc6633"&gt;.DecryptBase64String&lt;/span&gt;(value);    &lt;span style="color: #606060"&gt; 154:&lt;/span&gt;                 }    &lt;span style="color: #606060"&gt; 155:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 156:&lt;/span&gt;                 result &lt;span style="color: #006080"&gt;= value;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 157:&lt;/span&gt;             &lt;span style="color: #006080"&gt;}    &lt;span style="color: #606060"&gt; 158:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 159:&lt;/span&gt;             return result;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 160:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt; 161:&lt;/span&gt;     }    &lt;span style="color: #606060"&gt; 162:&lt;/span&gt; }  &lt;/div&gt;&lt;/div&gt;&lt;p&gt;其类型成员及说明如下：&lt;/p&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="1" border="0" alt="1" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/04_7BCE/1_3.png" width="575" height="185" /&gt; &lt;/p&gt;&lt;ul&gt;  &lt;li&gt;构造方法：两个参数，一个表示配置文件的文件名，另一个为配置文件需要加密时使用的加密工具类&lt;/li&gt;  &lt;li&gt;SetConfiguration方法，添加或修改配置项的值&lt;/li&gt;  &lt;li&gt;GetConfiguration方法，获取某配置项的值，如配置项加密，则返回解密后的值&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;建立对配置文件操作的测试类，测试类代码如下：&lt;/p&gt;&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;    &lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;    &lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; CommonUtilityLibrary.Configuration;    &lt;span style="color: #606060"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; CommonUtilityLibrary.SymmetricCryptography;    &lt;span style="color: #606060"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.VisualStudio.TestTools.UnitTesting;    &lt;span style="color: #606060"&gt;   6:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;   7:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; ExamSolution.SolutionUnitTestProject.CommonUtilityLibrary.Configuration    &lt;span style="color: #606060"&gt;   9:&lt;/span&gt; {    &lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// 配置文件操作工具类测试&lt;/span&gt;    &lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     [TestClass]    &lt;span style="color: #606060"&gt;  14:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ConfigurationUtilityUnitTest    &lt;span style="color: #606060"&gt;  15:&lt;/span&gt;     {    &lt;span style="color: #606060"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; IV_AESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;xMHcVFe6M0cFuj2XwDxW4g==&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  17:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; KEY_AESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;2lrJwsLB3yejIqaxp5AHo+KFIzQnHbMG6bJB70L4bfo=&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  18:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  19:&lt;/span&gt;         [TestMethod]    &lt;span style="color: #606060"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; TestConfigurationUtility()    &lt;span style="color: #606060"&gt;  21:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  22:&lt;/span&gt;             SymmetricCryptographyUtility crypt = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SymmetricCryptographyUtility(    &lt;span style="color: #606060"&gt;  23:&lt;/span&gt;                 SymmetricCryptographyTypeEnum.AesCryptoServiceProvider,    &lt;span style="color: #606060"&gt;  24:&lt;/span&gt;                 Convert.FromBase64String(IV_AESCRYPTOSERVICEPROVIDER),    &lt;span style="color: #606060"&gt;  25:&lt;/span&gt;                 Convert.FromBase64String(KEY_AESCRYPTOSERVICEPROVIDER));    &lt;span style="color: #606060"&gt;  26:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  27:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; configFileName = Path.Combine(    &lt;span style="color: #606060"&gt;  28:&lt;/span&gt;                 AppDomain.CurrentDomain.BaseDirectory,    &lt;span style="color: #606060"&gt;  29:&lt;/span&gt;                 &lt;span style="color: #006080"&gt;@&amp;quot;CommonUtilityLibrary\Configuration\ConfigurationFile.xml&amp;quot;&lt;/span&gt;);    &lt;span style="color: #606060"&gt;  30:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  31:&lt;/span&gt;             ConfigurationUtility config = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ConfigurationUtility(    &lt;span style="color: #606060"&gt;  32:&lt;/span&gt;                 configFileName,crypt);    &lt;span style="color: #606060"&gt;  33:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  34:&lt;/span&gt;             config.SetConfiguration(&lt;span style="color: #006080"&gt;&amp;quot;ConfigA&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Config A Value，配置A的值&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);    &lt;span style="color: #606060"&gt;  35:&lt;/span&gt;             config.SetConfiguration(&lt;span style="color: #006080"&gt;&amp;quot;ConfigB&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Config B Value，配置B的加密值&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);    &lt;span style="color: #606060"&gt;  36:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  37:&lt;/span&gt;             Console.WriteLine(config.GetConfiguration(&lt;span style="color: #006080"&gt;&amp;quot;ConfigA&amp;quot;&lt;/span&gt;));    &lt;span style="color: #606060"&gt;  38:&lt;/span&gt;             Console.WriteLine(config.GetConfiguration(&lt;span style="color: #006080"&gt;&amp;quot;ConfigB&amp;quot;&lt;/span&gt;));    &lt;span style="color: #606060"&gt;  39:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  40:&lt;/span&gt;     }    &lt;span style="color: #606060"&gt;  41:&lt;/span&gt; }  &lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试结果如下：&lt;/p&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2" border="0" alt="2" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/04_7BCE/2_3.png" width="641" height="295" /&gt; &lt;/p&gt;&lt;p&gt;配置文件的内容为：&lt;/p&gt;&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configurations&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   3:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;config&lt;/span&gt; &lt;span style="color: #ff0000"&gt;key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ConfigA&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Config A Value，配置A的值&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;isCrypt&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;False&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   4:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;config&lt;/span&gt; &lt;span style="color: #ff0000"&gt;key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ConfigB&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;78wPM5KLDQu534RLyhiZoZB3LwbJ8JF3uzl2Wttm+Uw43CgXyjDRmAUdG75SPnVZ&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;isCrypt&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configurations&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;  &lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;本文源代码下载：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="http://files.cnblogs.com/DragonInSea/ExamSolution_04.rar" href="http://files.cnblogs.com/DragonInSea/ExamSolution_04.rar"&gt;http://files.cnblogs.com/DragonInSea/ExamSolution_04.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div style="border-bottom: rgb(224,224,224) 1px dashed; border-left: rgb(224,224,224) 1px dashed; padding-bottom: 10px; padding-left: 30px; padding-right: 10px; font-family: 微软雅黑; background: url(http://www.zu14.cn/tip/6.gif) rgb(255,254,238) no-repeat 4px 6px; border-top: rgb(224,224,224) 1px dashed; border-right: rgb(224,224,224) 1px dashed; padding-top: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;《企业考试系统》项目实践索引页：&lt;a title="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html"&gt;http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/DragonInSea/aggbug/1753022.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/07/1753022.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749997.html</id><title type="text">《企业考试系统》项目实践（03）：通用工具类库之对称加密算法</title><summary type="text">摘要：实现通用的对称加密算法工具类。   在.Net Framework中与安全、加密相关的共有三大类： Hash算法：将一个流使用Hash算法计算其相应的Hash值，我们最常见的MD5...</summary><published>2010-06-02T06:48:00Z</published><updated>2010-06-02T06:48:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749997.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749997.html"/><content type="html">&lt;p&gt;摘要：实现通用的对称加密算法工具类。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在.Net Framework中与安全、加密相关的共有三大类：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Hash算法：将一个流使用Hash算法计算其相应的Hash值，我们最常见的MD5、SHA1均属于Hash算法。 &lt;/li&gt;    &lt;li&gt;对称算法：顾名思义，可以双向对一个流（Byte数组）进行加密和解密操作，本文主要使用的就是此算法 &lt;/li&gt;    &lt;li&gt;非对称算法：只能单向“加密”一个流（Byte数组），而不能反向解密 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;在.Net Framework中，涉及对称加密的算法的类有如下一些，其继承结构图为：&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1" border="0" alt="1" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/03_BE7F/1_3.png" width="849" height="503" /&gt; &lt;/p&gt;  &lt;p&gt;其中：SymmetricAlgorithm类为对称算法的根类，其子类为几种对称加密算法，再子类是具体的实现类。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;使用对称加密算法实现对称加密时，代码基本类似，我将其封装一下，定义两个类型：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SymmetricCryptographyTypeEnum枚举：表示系统支持的对称加密类型 &lt;/li&gt;    &lt;li&gt;SymmetricCryptographyUtility类：提供对于Byte数组及字符串进行加密及解密的方法 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SymmetricCryptographyTypeEnum枚举的定义如下：&lt;/strong&gt;&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; height: 224px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;   &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     &lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; DHC_Certification_System.CommonLibrary.SymmetricCryptography    &lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {    &lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// 使用的对称加密类型&lt;/span&gt;    &lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; SymmetricCryptographyTypeEnum    &lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     {    &lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         DESCryptoServiceProvider,    &lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         AesCryptoServiceProvider,    &lt;span style="color: #606060"&gt;  10:&lt;/span&gt;         RC2CryptoServiceProvider,    &lt;span style="color: #606060"&gt;  11:&lt;/span&gt;         RijndaelManaged,    &lt;span style="color: #606060"&gt;  12:&lt;/span&gt;         TripleDESCryptoServiceProvider    &lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     }    &lt;span style="color: #606060"&gt;  14:&lt;/span&gt; }  &lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;SymmetricCryptographyUtility类定义如下：&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; height: 225px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;    &lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;    &lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Security.Cryptography;    &lt;span style="color: #606060"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;    &lt;span style="color: #606060"&gt;   5:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; DHC_Certification_System.CommonLibrary.SymmetricCryptography    &lt;span style="color: #606060"&gt;   7:&lt;/span&gt; {    &lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   9:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// 对称加密工具类&lt;/span&gt;    &lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SymmetricCryptographyUtility    &lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     {    &lt;span style="color: #606060"&gt;  13:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  14:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 对称加密类的驱动类型&lt;/span&gt;    &lt;span style="color: #606060"&gt;  15:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; SymmetricAlgorithm _Provider;    &lt;span style="color: #606060"&gt;  17:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  18:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  19:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 构造方法，使用自定义的的IV和KEY&lt;/span&gt;    &lt;span style="color: #606060"&gt;  20:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  21:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;cryptType&amp;quot;&amp;gt;使用的加密算法&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  22:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;iv&amp;quot;&amp;gt;IV值&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  23:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;KEY值&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  24:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SymmetricCryptographyUtility(    &lt;span style="color: #606060"&gt;  25:&lt;/span&gt;             SymmetricCryptographyTypeEnum cryptType,    &lt;span style="color: #606060"&gt;  26:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] iv, &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] key)    &lt;span style="color: #606060"&gt;  27:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  28:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;switch&lt;/span&gt; (cryptType)    &lt;span style="color: #606060"&gt;  29:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt;  30:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SymmetricCryptographyTypeEnum.DESCryptoServiceProvider:    &lt;span style="color: #606060"&gt;  31:&lt;/span&gt;                     _Provider = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DESCryptoServiceProvider();    &lt;span style="color: #606060"&gt;  32:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  33:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SymmetricCryptographyTypeEnum.AesCryptoServiceProvider:    &lt;span style="color: #606060"&gt;  34:&lt;/span&gt;                     _Provider = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AesCryptoServiceProvider();    &lt;span style="color: #606060"&gt;  35:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  36:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SymmetricCryptographyTypeEnum.RC2CryptoServiceProvider:    &lt;span style="color: #606060"&gt;  37:&lt;/span&gt;                     _Provider = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RC2CryptoServiceProvider();    &lt;span style="color: #606060"&gt;  38:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  39:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SymmetricCryptographyTypeEnum.RijndaelManaged:    &lt;span style="color: #606060"&gt;  40:&lt;/span&gt;                     _Provider = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RijndaelManaged();    &lt;span style="color: #606060"&gt;  41:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  42:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SymmetricCryptographyTypeEnum.TripleDESCryptoServiceProvider:    &lt;span style="color: #606060"&gt;  43:&lt;/span&gt;                     _Provider = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TripleDESCryptoServiceProvider();    &lt;span style="color: #606060"&gt;  44:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  45:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt;  46:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  47:&lt;/span&gt;             _Provider.IV = iv;    &lt;span style="color: #606060"&gt;  48:&lt;/span&gt;             _Provider.Key = key;    &lt;span style="color: #606060"&gt;  49:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  50:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  51:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SymmetricAlgorithm Provider    &lt;span style="color: #606060"&gt;  52:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  53:&lt;/span&gt;             get    &lt;span style="color: #606060"&gt;  54:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt;  55:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _Provider;    &lt;span style="color: #606060"&gt;  56:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt;  57:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  58:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  59:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  60:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 加密字符串&lt;/span&gt;    &lt;span style="color: #606060"&gt;  61:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  62:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  63:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  64:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; EncryptBase64String(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; input)    &lt;span style="color: #606060"&gt;  65:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  66:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; result = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  67:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  68:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(input) == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)    &lt;span style="color: #606060"&gt;  69:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt;  70:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] inputArray = Encoding.Unicode.GetBytes(input);    &lt;span style="color: #606060"&gt;  71:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] cryptArray = EncryptByteArray(inputArray);    &lt;span style="color: #606060"&gt;  72:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  73:&lt;/span&gt;                 result = Convert.ToBase64String(cryptArray);    &lt;span style="color: #606060"&gt;  74:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt;  75:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  76:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;    &lt;span style="color: #606060"&gt;  77:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  78:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  79:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  80:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 解密字符串&lt;/span&gt;    &lt;span style="color: #606060"&gt;  81:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  82:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  83:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  84:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; DecryptBase64String(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; input)    &lt;span style="color: #606060"&gt;  85:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  86:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; result = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  87:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  88:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(input) == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)    &lt;span style="color: #606060"&gt;  89:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt;  90:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] inputArray = Convert.FromBase64String(input);    &lt;span style="color: #606060"&gt;  91:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] cryptArray = DecryptByteArray(inputArray);    &lt;span style="color: #606060"&gt;  92:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  93:&lt;/span&gt;                 result = Encoding.Unicode.GetString(cryptArray);    &lt;span style="color: #606060"&gt;  94:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt;  95:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  96:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;    &lt;span style="color: #606060"&gt;  97:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  98:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  99:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 100:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 加密Byte数组&lt;/span&gt;    &lt;span style="color: #606060"&gt; 101:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 102:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 103:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 104:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] EncryptByteArray(&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] input)    &lt;span style="color: #606060"&gt; 105:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt; 106:&lt;/span&gt;             MemoryStream ms = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MemoryStream();    &lt;span style="color: #606060"&gt; 107:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 108:&lt;/span&gt;             CryptoStream cs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CryptoStream(    &lt;span style="color: #606060"&gt; 109:&lt;/span&gt;                 ms, _Provider.CreateEncryptor(), CryptoStreamMode.Write);    &lt;span style="color: #606060"&gt; 110:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 111:&lt;/span&gt;             cs.Write(input, 0, input.Length);    &lt;span style="color: #606060"&gt; 112:&lt;/span&gt;             cs.FlushFinalBlock();    &lt;span style="color: #606060"&gt; 113:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 114:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] result = ms.ToArray();    &lt;span style="color: #606060"&gt; 115:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 116:&lt;/span&gt;             cs.Close();    &lt;span style="color: #606060"&gt; 117:&lt;/span&gt;             ms.Close();    &lt;span style="color: #606060"&gt; 118:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 119:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;    &lt;span style="color: #606060"&gt; 120:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt; 121:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 122:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 123:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 解密Byte数组&lt;/span&gt;    &lt;span style="color: #606060"&gt; 124:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 125:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 126:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt; 127:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] DecryptByteArray(&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] input)    &lt;span style="color: #606060"&gt; 128:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt; 129:&lt;/span&gt;             MemoryStream ms = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MemoryStream();    &lt;span style="color: #606060"&gt; 130:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 131:&lt;/span&gt;             CryptoStream cs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CryptoStream(    &lt;span style="color: #606060"&gt; 132:&lt;/span&gt;                 ms, _Provider.CreateDecryptor(), CryptoStreamMode.Write);    &lt;span style="color: #606060"&gt; 133:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 134:&lt;/span&gt;             cs.Write(input, 0, input.Length);    &lt;span style="color: #606060"&gt; 135:&lt;/span&gt;             cs.FlushFinalBlock();    &lt;span style="color: #606060"&gt; 136:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 137:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] result = ms.ToArray();    &lt;span style="color: #606060"&gt; 138:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 139:&lt;/span&gt;             cs.Close();    &lt;span style="color: #606060"&gt; 140:&lt;/span&gt;             ms.Close();    &lt;span style="color: #606060"&gt; 141:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt; 142:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;    &lt;span style="color: #606060"&gt; 143:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt; 144:&lt;/span&gt;     }    &lt;span style="color: #606060"&gt; 145:&lt;/span&gt; }  &lt;/div&gt;&lt;/div&gt;&lt;p&gt;此类的类成员为：&lt;/p&gt;&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2" border="0" alt="2" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/03_BE7F/2_3.png" width="677" height="311" /&gt; &lt;/p&gt;&lt;ul&gt;  &lt;li&gt;构造方法有三个参数：一个为使用的对称加密算法的类型，后两个是对称加密算法对应的IV及KEY值（需要注意的是，不同的算法要求的IV和KEY使用的Byte数组的长度不同，具体可查阅MSDN） &lt;/li&gt;  &lt;li&gt;EncryptByteArray和DecryptByteArray两个方法是针对于Byte数组的加密与解密 &lt;/li&gt;  &lt;li&gt;EncryptBase64String和DecryptBase64String两个方法是针对于字符串的加密与解密 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;定义如下的单体测试代码：&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;    &lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;    &lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; CommonUtilityLibrary.SymmetricCryptography;    &lt;span style="color: #606060"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.VisualStudio.TestTools.UnitTesting;    &lt;span style="color: #606060"&gt;   5:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; ExamSolution.SolutionUnitTestProject.CommonUtilityLibrary.SymmetricCryptography    &lt;span style="color: #606060"&gt;   7:&lt;/span&gt; {    &lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;   9:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// 对称加密算法加密、解密测试&lt;/span&gt;    &lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     [TestClass]    &lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SymmetricCryptUnitTest    &lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     {    &lt;span style="color: #606060"&gt;  14:&lt;/span&gt;         &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; 各种Provider的对称加字算法的默认IV和KEY    &lt;span style="color: #606060"&gt;  15:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; IV_DESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;/KiP+1c5dZA=&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; KEY_DESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;AuNOICVT27g=&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  17:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  18:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; IV_AESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;xMHcVFe6M0cFuj2XwDxW4g==&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  19:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; KEY_AESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;2lrJwsLB3yejIqaxp5AHo+KFIzQnHbMG6bJB70L4bfo=&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  20:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  21:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; IV_RC2CRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;SfcSRMSyCD4=&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  22:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; KEY_RC2CRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;IN4Gg2FNrlEl82VRUBewaA==&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  23:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  24:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; IV_RIJNDAELMANAGED = &lt;span style="color: #006080"&gt;@&amp;quot;bv28soM12cTLKd1ObZV5RA==&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  25:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; KEY_RIJNDAELMANAGED = &lt;span style="color: #006080"&gt;@&amp;quot;u7R7DbMcCrh9MynjARrEsr0wIUFy9GujyHddE2k7Ric=&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  26:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  27:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; IV_TRIPLEDESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;cd8FQK7xXDk=&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  28:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; KEY_TRIPLEDESCRYPTOSERVICEPROVIDER = &lt;span style="color: #006080"&gt;@&amp;quot;RpbofS6+6f1cE6HzpoAhmZ8kM0PXvNS/&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  29:&lt;/span&gt;         &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;    &lt;span style="color: #606060"&gt;  30:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  31:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  32:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 测试方法&lt;/span&gt;    &lt;span style="color: #606060"&gt;  33:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  34:&lt;/span&gt;         [TestMethod]    &lt;span style="color: #606060"&gt;  35:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SymmetricCryptographyUtility()    &lt;span style="color: #606060"&gt;  36:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  37:&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;测试开始：&amp;quot;&lt;/span&gt;);    &lt;span style="color: #606060"&gt;  38:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  39:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; baseString = &lt;span style="color: #006080"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;;    &lt;span style="color: #606060"&gt;  40:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] baseByte = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};    &lt;span style="color: #606060"&gt;  41:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  42:&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;原始字符串为：{0}&amp;quot;&lt;/span&gt;,baseString);    &lt;span style="color: #606060"&gt;  43:&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;原始Byte数组为：{0}&amp;quot;&lt;/span&gt;, ConvertByteToHexString(baseByte));    &lt;span style="color: #606060"&gt;  44:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  45:&lt;/span&gt;             SymmetricCryptographyUtility[] crypts = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SymmetricCryptographyUtility[5];    &lt;span style="color: #606060"&gt;  46:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  47:&lt;/span&gt;             crypts[0] = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SymmetricCryptographyUtility(    &lt;span style="color: #606060"&gt;  48:&lt;/span&gt;                 SymmetricCryptographyTypeEnum.DESCryptoServiceProvider,    &lt;span style="color: #606060"&gt;  49:&lt;/span&gt;                 Convert.FromBase64String(IV_DESCRYPTOSERVICEPROVIDER),     &lt;span style="color: #606060"&gt;  50:&lt;/span&gt;                 Convert.FromBase64String(KEY_DESCRYPTOSERVICEPROVIDER));    &lt;span style="color: #606060"&gt;  51:&lt;/span&gt;             crypts[1] = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SymmetricCryptographyUtility(    &lt;span style="color: #606060"&gt;  52:&lt;/span&gt;                 SymmetricCryptographyTypeEnum.AesCryptoServiceProvider,    &lt;span style="color: #606060"&gt;  53:&lt;/span&gt;                 Convert.FromBase64String(IV_AESCRYPTOSERVICEPROVIDER),    &lt;span style="color: #606060"&gt;  54:&lt;/span&gt;                 Convert.FromBase64String(KEY_AESCRYPTOSERVICEPROVIDER));    &lt;span style="color: #606060"&gt;  55:&lt;/span&gt;             crypts[2] = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SymmetricCryptographyUtility(    &lt;span style="color: #606060"&gt;  56:&lt;/span&gt;                 SymmetricCryptographyTypeEnum.RC2CryptoServiceProvider,    &lt;span style="color: #606060"&gt;  57:&lt;/span&gt;                 Convert.FromBase64String(IV_RC2CRYPTOSERVICEPROVIDER),    &lt;span style="color: #606060"&gt;  58:&lt;/span&gt;                 Convert.FromBase64String(KEY_RC2CRYPTOSERVICEPROVIDER));    &lt;span style="color: #606060"&gt;  59:&lt;/span&gt;             crypts[3] = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SymmetricCryptographyUtility(    &lt;span style="color: #606060"&gt;  60:&lt;/span&gt;                 SymmetricCryptographyTypeEnum.RijndaelManaged,    &lt;span style="color: #606060"&gt;  61:&lt;/span&gt;                 Convert.FromBase64String(IV_RIJNDAELMANAGED),    &lt;span style="color: #606060"&gt;  62:&lt;/span&gt;                 Convert.FromBase64String(KEY_RIJNDAELMANAGED));    &lt;span style="color: #606060"&gt;  63:&lt;/span&gt;             crypts[4] = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SymmetricCryptographyUtility(    &lt;span style="color: #606060"&gt;  64:&lt;/span&gt;                 SymmetricCryptographyTypeEnum.TripleDESCryptoServiceProvider,    &lt;span style="color: #606060"&gt;  65:&lt;/span&gt;                 Convert.FromBase64String(IV_TRIPLEDESCRYPTOSERVICEPROVIDER),    &lt;span style="color: #606060"&gt;  66:&lt;/span&gt;                 Convert.FromBase64String(KEY_TRIPLEDESCRYPTOSERVICEPROVIDER));    &lt;span style="color: #606060"&gt;  67:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  68:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (SymmetricCryptographyUtility crypt &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; crypts)    &lt;span style="color: #606060"&gt;  69:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt;  70:&lt;/span&gt;                 Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;====================================================&amp;quot;&lt;/span&gt;);    &lt;span style="color: #606060"&gt;  71:&lt;/span&gt;                 Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;加密算法的类型为：{0}&amp;quot;&lt;/span&gt;, crypt.Provider.GetType().Name);    &lt;span style="color: #606060"&gt;  72:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  73:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; cryptString = crypt.EncryptBase64String(baseString);    &lt;span style="color: #606060"&gt;  74:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; deCryptString = crypt.DecryptBase64String(cryptString);    &lt;span style="color: #606060"&gt;  75:&lt;/span&gt;                 Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;加密后的字符串为：{0}&amp;quot;&lt;/span&gt;,cryptString);    &lt;span style="color: #606060"&gt;  76:&lt;/span&gt;                 Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;解密后的字符串为：{0}&amp;quot;&lt;/span&gt;, deCryptString);    &lt;span style="color: #606060"&gt;  77:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  78:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] cryptByte = crypt.EncryptByteArray(baseByte);    &lt;span style="color: #606060"&gt;  79:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] deCryptByte = crypt.DecryptByteArray(cryptByte);    &lt;span style="color: #606060"&gt;  80:&lt;/span&gt;                 Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;加密后的Byte数组为：{0}&amp;quot;&lt;/span&gt;, ConvertByteToHexString(cryptByte));    &lt;span style="color: #606060"&gt;  81:&lt;/span&gt;                 Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;解密后的Byte数组为：{0}&amp;quot;&lt;/span&gt;, ConvertByteToHexString(deCryptByte));    &lt;span style="color: #606060"&gt;  82:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt;  83:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  84:&lt;/span&gt;&amp;#160;     &lt;span style="color: #606060"&gt;  85:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  86:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 将Byte数组转换为字符串，其中每个Byte转换为两位十六进制的数字表示的字符串&lt;/span&gt;    &lt;span style="color: #606060"&gt;  87:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  88:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;items&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  89:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;    &lt;span style="color: #606060"&gt;  90:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ConvertByteToHexString(&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] items)    &lt;span style="color: #606060"&gt;  91:&lt;/span&gt;         {    &lt;span style="color: #606060"&gt;  92:&lt;/span&gt;             StringBuilder builder = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringBuilder();    &lt;span style="color: #606060"&gt;  93:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt; item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; items)    &lt;span style="color: #606060"&gt;  94:&lt;/span&gt;             {    &lt;span style="color: #606060"&gt;  95:&lt;/span&gt;                 builder.Append(item.ToString(&lt;span style="color: #006080"&gt;&amp;quot;X2&amp;quot;&lt;/span&gt;));    &lt;span style="color: #606060"&gt;  96:&lt;/span&gt;             }    &lt;span style="color: #606060"&gt;  97:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; builder.ToString();    &lt;span style="color: #606060"&gt;  98:&lt;/span&gt;         }    &lt;span style="color: #606060"&gt;  99:&lt;/span&gt;     }    &lt;span style="color: #606060"&gt; 100:&lt;/span&gt; }  &lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;测试结果如下：&lt;/p&gt;&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3" border="0" alt="3" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/03_BE7F/3_3.png" width="627" height="789" /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;本文源代码下载&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="http://files.cnblogs.com/DragonInSea/ExamSolution_03.rar" href="http://files.cnblogs.com/DragonInSea/ExamSolution_03.rar"&gt;http://files.cnblogs.com/DragonInSea/ExamSolution_03.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div style="border-bottom: rgb(224,224,224) 1px dashed; border-left: rgb(224,224,224) 1px dashed; padding-bottom: 10px; padding-left: 30px; padding-right: 10px; font-family: 微软雅黑; background: url(http://www.zu14.cn/tip/6.gif) rgb(255,254,238) no-repeat 4px 6px; border-top: rgb(224,224,224) 1px dashed; border-right: rgb(224,224,224) 1px dashed; padding-top: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;《企业考试系统》项目实践索引页：&lt;a title="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html"&gt;http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html&lt;/a&gt;&lt;/div&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:c47caa45-1642-45d3-9f26-5ed4e6a0602e" class="wlWriterEditableSmartContent"&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:c47caa45-1642-45d3-9f26-5ed4e6a0602e" class="wlWriterSmartContent"&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/DragonInSea/aggbug/1749997.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749997.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749925.html</id><title type="text">《企业考试系统》项目实践（02）：应用程序体系结构</title><summary type="text">摘要： 阐述《企业员工认证考试系统》及《企业考试后台管理系统》所使用的程序体系结构，各层的组成及其作用。  对于较为复杂的“企业级”应用程序，应选择适当的体系结构来满足面向对象的“可复...</summary><published>2010-06-02T05:11:00Z</published><updated>2010-06-02T05:11:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749925.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749925.html"/><content type="html">&lt;p&gt;摘要：&lt;/p&gt;  &lt;p&gt;阐述《企业员工认证考试系统》及《企业考试后台管理系统》所使用的程序体系结构，各层的组成及其作用。 &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;对于较为复杂的“企业级”应用程序，应选择适当的体系结构来满足面向对象的“可复用”、“可维护”原则，参考Microsoft P&amp;amp;P 企业应用程序库中DAAB（数据访问应用程序块）的结构，针对本系统我采用如下的结构：&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1" border="0" alt="1" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/02_9FA5/1_3.png" width="706" height="323" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;数据服务层&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;数据服务层实际上就是相应的数据库，提供数据的基础存储及基本的数据操作，按照MS的建议，对于数据库的操作尽量通过存储过程实现而不是在代码中添加SQL语句&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;/p&gt;  &lt;ul&gt;   &lt;li&gt;加密、解密的算法 &lt;/li&gt;    &lt;li&gt;自定义的配置文件的操作 &lt;/li&gt;    &lt;li&gt;字符串的通用操作，如字符串格式验证、字符串拼接、数字型货币转中文大写等等 &lt;/li&gt;    &lt;li&gt;图片的操作，如图片与二进制数据间的相互转换、图像的转换、缩略图、模糊、锐化等 &lt;/li&gt;    &lt;li&gt;自定义的日志操作 &lt;/li&gt;    &lt;li&gt;自定义的异常类型 &lt;/li&gt;    &lt;li&gt;数据的分页、筛选、查找 &lt;/li&gt;    &lt;li&gt;等等 &lt;/li&gt; &lt;/ul&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;ul&gt;   &lt;li&gt;基于连接方式操作数据时，封装数据的“实体类”，这一部分现可用ADO.Net Entry Framework替换 &lt;/li&gt;    &lt;li&gt;基于非连接方式的类型化的DataSet，即VS中的“数据集”（可复用的DataSet的子类） &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;数据访问层（Data Access Layer，DAL）&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;执行数据操作，将获取的数据源中的数据封装到相应的数据模块类型的实例中，其依赖数据模块，在业务逻辑层（BLL）和通用数据访问工具中起到连接的作用&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;业务逻辑层（Business Logic Layer，BLL）&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt; 业务逻辑层的主要功能即为封装业务逻辑，其具体的功能有如下几点：&lt;/p&gt;  &lt;ul&gt;   &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;li&gt;对业务数据进行逻辑上的整合，例如在数据库中存储的数据为加密数据，在此处进行解密处理；处理计算列的结果等&lt;/li&gt;    &lt;li&gt;实现组件端的数据输入验证&lt;/li&gt;    &lt;li&gt;定义并实现异常策略，例如当组件端异常产生时如何处理这个异常&lt;/li&gt;    &lt;li&gt;等等&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;附加服务层&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;即为Web Service，添加基于Web Service的功能，例如多个子系统用户的“单点登陆”服务等。其可以与BLL层或Web 应用程序结合为一层。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;数据展示层&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;即为UI层，可以是Windows应用程序、Web应用程序等等，其主要功能包括：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;用户交互&lt;/li&gt;    &lt;li&gt;界面端数据输入验证&lt;/li&gt;    &lt;li&gt;等等&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;对于此应用程序体系结构的划分主要是我个人的经验及习惯，各位如果有比较成熟的或你认为比较好的应用程序体系结构的组成方式，可以在评论中多多交流，或者发表到你的Blogs中，在评论中留下地址，我们多多讨论。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;br /&gt;  &lt;div style="border-bottom: rgb(224,224,224) 1px dashed; border-left: rgb(224,224,224) 1px dashed; padding-bottom: 10px; padding-left: 30px; padding-right: 10px; font-family: 微软雅黑; background: url(http://www.zu14.cn/tip/6.gif) rgb(255,254,238) no-repeat 4px 6px; border-top: rgb(224,224,224) 1px dashed; border-right: rgb(224,224,224) 1px dashed; padding-top: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;《企业考试系统》项目实践索引页：&lt;a title="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html"&gt;http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/DragonInSea/aggbug/1749925.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749925.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749807.html</id><title type="text">《企业考试系统》项目实践（01）：概述及需求分析</title><summary type="text">摘要：使用Visual Studio 2010，开发基于企业内部考试及考试管理的《企业员工认证考试系统》及《企业员工认证考试管理系统》。   本人所在的公司是一个软件开发公司下属的培训中心，在年初总公司提出需求，仿照MS MCTS、SUN SCJP、Oracle OCA等认证考试的模式对员工的技术能力进行考核，考虑要投入及企业员工内部的需求问题，不进行常规的认证考试，由我设计一个考试...</summary><published>2010-06-02T02:54:00Z</published><updated>2010-06-02T02:54:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749807.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749807.html"/><content type="html">&lt;p&gt;摘要：使用Visual Studio 2010，开发基于企业内部考试及考试管理的《企业员工认证考试系统》及《企业员工认证考试管理系统》。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;本人所在的公司是一个软件开发公司下属的培训中心，在年初总公司提出需求，仿照MS MCTS、SUN SCJP、Oracle OCA等认证考试的模式对员工的技术能力进行考核，考虑要投入及企业员工内部的需求问题，不进行常规的认证考试，由我设计一个考试系统来满足其需求。另外本人也考虑到其他需要进行考试的教学需要，设计、开发一套考试及考试管理系统。&lt;/p&gt;  &lt;p&gt;在网上查询了许久，发现网上的一些考试系统（开源的或免费的）都不能符合我们的需要，因此我自己设计、开发一套新的系统，现在系统基本已经开发完毕，在这里分享给大家，也算是对于已完成系统的一次重构。也请各位大牛提出意见和建议。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;需求分析：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1、基本参照考试模式：MCTS等计算机认证考试、日语能力等级考试、日常学生考试&lt;/p&gt;  &lt;p&gt;2、考试、试题、试卷等：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1）考试类型大体确定，其中每考试类型包含若干知识点，每知识点涉及技术类别、技术级别&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2）试卷对应试题采用手动组卷模式，即手动由试题库中的若干试题组成一套试卷（如今后有可能，在题库丰富、技术可行的前提下，可以改为自动随机组卷）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3）每试题的知识点确定，且仅对应一个知识点。试题的类型分为单项选择题、多项选择题和主观题。考虑到安全性问题，试题以数据形式，加密存放到数据库&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4）一个考试可由多个试卷组成，且考试是否通过可以是由得分或答对数量或答对百分比确定（例如MS和认证考试即为此种），也可以由考试各试卷是否均通过（例如我大学时期的外语四六级考试即为此种，作文必须合格，如作文分数不够，即使总成绩足够也算未通过）&lt;/p&gt;  &lt;p&gt;3、考试环境：考虑到只是公司内部使用，《考试系统》采用C/S结构，只能在局域网内实施&lt;/p&gt;  &lt;p&gt;4、考试后有多种报表提供给不同的人（如：员工得到其考试结论报表，部门经理得到其部门员工的统计报表等）&lt;/p&gt;  &lt;p&gt;5、还有其他的一些细节内容，逐步在后面的功能实现中再详细讨论。。。&lt;/p&gt;  &lt;p&gt;基本功能如下图所示：&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2" border="0" alt="2" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/01_8A37/2_3.png" width="583" height="652" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;系统架构：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1" border="0" alt="1" src="http://images.cnblogs.com/cnblogs_com/DragonInSea/WindowsLiveWriter/01_8A37/1_3.png" width="477" height="299" /&gt; &lt;/p&gt;  &lt;p&gt;1、后台管理系统采用B/S结构（或C/S结构，本人已做完的后台管理系统采用的是C/S结构，但为了多研究一些技术上的问题，想在第二版中采用基于Silverlight的B/S结构）&lt;/p&gt;  &lt;p&gt;2、前台考试系统采用C/S结构（本人已做完的后台管理系统采用的是基于Form的Windows应用程序，但为了多研究一些技术上的问题，想在第二版中采用基于WPF的Windows应用程序）&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;系统平台&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 数据库服务器：SQL Server 2008 R2&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Web服务器：Windows 2003 R2 + IIS&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 前台考试系统客户端：XP或Vista或Windows 7 + Framework&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 后台考试管理系统客户端：各种支持Silverlight的浏览器&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;开发平台：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Windows 7&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; .Net Framework 4.0&amp;#160; +&amp;#160; Visual Studio 2010&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 编程语言：C#&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 前台考试系统界面：WPF4&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 后台考试管理系统：ASP.Net 4.0 + Silverlight 4&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; （注：已完成版本前台、后台均为基于Framework 2.0的Windows应用程序，在此只是为了更多的学习、掌握一些新的技术）&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;辅助工具：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Power Designer 15：用于数据库设计&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; CodeSmith：用来生成一些重复代码&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; PhotoShop：用来做一些图片&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Dreamweaver：用来做一些网站的前台设计&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Expression Blend：用来做一些WPF和Silverlight的前台设计&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Trufun UML：UML工具&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; …&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;待续…&lt;/p&gt;  &lt;br /&gt;  &lt;div style="border-bottom: rgb(224,224,224) 1px dashed; border-left: rgb(224,224,224) 1px dashed; padding-bottom: 10px; padding-left: 30px; padding-right: 10px; font-family: 微软雅黑; background: url(http://www.zu14.cn/tip/6.gif) rgb(255,254,238) no-repeat 4px 6px; border-top: rgb(224,224,224) 1px dashed; border-right: rgb(224,224,224) 1px dashed; padding-top: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;《企业考试系统》项目实践索引页：&lt;a title="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html"&gt;http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/DragonInSea/aggbug/1749807.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749807.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html</id><title type="text">《企业考试系统》项目实践：索引页</title><summary type="text">前言： 先放在这里，留着以后慢慢写。 各文章索引： 《企业考试系统》项目实践（01）：概述及需求分析 《企业考试系统》项目实践（02）：应用程序体系结构 《企业考试系统》项目实践（03）：通用工具类库之对称加密算法 《企业考试系统》项目实践（04）：通用工具类库之配置文件操作工具   《企业考试系统》项目实践仅用作学习交流，请勿用于商业应用及商业教学使用，本人保存本博客文...</summary><published>2010-06-02T02:17:00Z</published><updated>2010-06-02T02:17:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html"/><content type="html">&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;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749807.html"&gt;《企业考试系统》项目实践（01）：概述及需求分析&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749925.html"&gt;《企业考试系统》项目实践（02）：应用程序体系结构&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749997.html"&gt;《企业考试系统》项目实践（03）：通用工具类库之对称加密算法&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/07/1753022.html"&gt;《企业考试系统》项目实践（04）：通用工具类库之配置文件操作工具&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom: rgb(224,224,224) 1px dashed; border-left: rgb(224,224,224) 1px dashed; padding-bottom: 10px; padding-left: 30px; padding-right: 10px; font-family: 微软雅黑; background: url(http://www.zu14.cn/tip/6.gif) rgb(255,254,238) no-repeat 4px 6px; border-top: rgb(224,224,224) 1px dashed; border-right: rgb(224,224,224) 1px dashed; padding-top: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;《企业考试系统》项目实践仅用作学习交流，请勿用于商业应用及商业教学使用，本人保存本博客文章的一切权利。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/DragonInSea/aggbug/1749762.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DragonInSea/archive/2010/06/02/1749762.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2009/06/24/1509953.html</id><title type="text">WPF and Silverlight 学习笔记（三十）：Brush（2）</title><summary type="text">上一篇文章主要绍介的是Brush中的SolidColorBrush、渐变Brush及TileBrush，本篇将详细探讨TileBrush的三种子类型：ImageBrush、DrawingBrush和V...</summary><published>2009-06-24T01:37:00Z</published><updated>2009-06-24T01:37:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/24/1509953.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/24/1509953.html"/><content type="text">上一篇文章主要绍介的是Brush中的SolidColorBrush、渐变Brush及TileBrush，本篇将详细探讨TileBrush的三种子类型：ImageBrush、DrawingBrush和V...</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2009/06/23/1509406.html</id><title type="text">WPF and Silverlight 学习笔记（二十九）：Brush（1）</title><summary type="text">在WPF和Silverlight中，Brush是应用很多的一种类型，主要用于填充各种图形及控件。Brush及其子类位于System.Windows.Media命名空间，其继承关系如下图所示： 一、So...</summary><published>2009-06-23T04:49:00Z</published><updated>2009-06-23T04:49:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/23/1509406.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/23/1509406.html"/><content type="text">在WPF和Silverlight中，Brush是应用很多的一种类型，主要用于填充各种图形及控件。Brush及其子类位于System.Windows.Media命名空间，其继承关系如下图所示： 一、So...</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2009/06/22/1508278.html</id><title type="text">WPF and Silverlight 学习笔记（二十八）：基本图形的使用（3）图形的操作</title><summary type="text">接上一篇文章，在WPF中对图形进行操作，上一篇文章中使用了ImageSource（BitmapSource）中的两种： 1、使用BitmapImage加载图片 2、使用RenderTargetBitm...</summary><published>2009-06-22T06:36:00Z</published><updated>2009-06-22T06:36:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/22/1508278.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/22/1508278.html"/><content type="text">接上一篇文章，在WPF中对图形进行操作，上一篇文章中使用了ImageSource（BitmapSource）中的两种： 1、使用BitmapImage加载图片 2、使用RenderTargetBitm...</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2009/06/16/1504417.html</id><title type="text">WPF and Silverlight 学习笔记（二十七）：基本图形的使用（2）Path和位图操作</title><summary type="text">在上一篇文章中主要讨论的是除Path之外的基本图形，本文主要讨论使用Path创建更加复杂的图形以及位图的处理。 一、使用Path构建复杂图形 Path所构建的图形由Data属性来定义，其属性的类型...</summary><published>2009-06-16T08:18:00Z</published><updated>2009-06-16T08:18:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/16/1504417.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/16/1504417.html"/><content type="text">在上一篇文章中主要讨论的是除Path之外的基本图形，本文主要讨论使用Path创建更加复杂的图形以及位图的处理。 一、使用Path构建复杂图形 Path所构建的图形由Data属性来定义，其属性的类型...</content></entry><entry><id>http://www.cnblogs.com/DragonInSea/archive/2009/06/09/1499562.html</id><title type="text">WPF and Silverlight 学习笔记（二十六）：基本图形使用（1）</title><summary type="text">在WPF中，极大地丰富了关于图形、图像等多媒体元素的操作功能，本节主要讨论基本的图形。 一、基本的图形类型 对于WPF中的基本图形类主要位于System.Windows.Shapes命名空间，其类...</summary><published>2009-06-09T05:09:00Z</published><updated>2009-06-09T05:09:00Z</updated><author><name>龙腾于海</name><uri>http://www.cnblogs.com/DragonInSea/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/09/1499562.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DragonInSea/archive/2009/06/09/1499562.html"/><content type="text">在WPF中，极大地丰富了关于图形、图像等多媒体元素的操作功能，本节主要讨论基本的图形。 一、基本的图形类型 对于WPF中的基本图形类主要位于System.Windows.Shapes命名空间，其类...</content></entry></feed>
