<?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/32794/rss</id><updated>2012-04-14T08:41:48Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/32794/rss"/><entry><id>http://www.cnblogs.com/Fly-sky/archive/2012/02/16/2354464.html</id><title type="text">XML操作不使用Json</title><summary type="text">操作XML时，使用Json和流处理，发现会报内存溢出。后优化为：DataTable.WriteXml(filePath);DataSet.ReadXml(XmlPath);性能改善不少。当然和研究很深的那种索引查询差距还是不小。</summary><published>2012-02-16T08:15:00Z</published><updated>2012-02-16T08:15:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2012/02/16/2354464.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2012/02/16/2354464.html"/><content type="html">&lt;p&gt;操作XML时，使用Json和流处理，发现会报内存溢出。&lt;/p&gt;&lt;p&gt;后优化为：&lt;/p&gt;&lt;p&gt;DataTable.WriteXml(filePath);&lt;/p&gt;&lt;p&gt;DataSet.ReadXml(XmlPath);&lt;/p&gt;&lt;p&gt;性能改善不少。&lt;/p&gt;&lt;p&gt;当然和研究很深的那种索引查询差距还是不小。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2354464.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2012/02/16/2354464.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320814.html</id><title type="text">Sql Server 2005实现负载均衡 读写分离</title><summary type="text">Internet的规模每一百天就会增长一倍，客户希望获得7天×24小时的不间断可用性及较快的系统反应时间，而不愿屡次看到某个站点“Server Too Busy”及频繁的系统故障。随着业务量的提高,以及访问量和数据流量的快速增长，网络各个核心部分的处理性能和计算强度也相应增大，使得单一设备根本无法承担。在此情况下，如果扔掉现有设备去做大量的硬件升级，必将造成现有资源的浪费，而且下一次业务量的提升，又将导致再一次硬件升级的高额成本投入。于是，负载均衡机制应运而生。对于负载均衡，笔者经常接触的当属Oracle的负载均衡机制。下面，我们先简单了解Oracle的负载均衡的实现方案。Real </summary><published>2012-01-12T08:52:00Z</published><updated>2012-01-12T08:52:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320814.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320814.html"/><content type="html">&lt;p&gt;Internet的规模每一百天就会增长一倍，客户希望获得7天&amp;times;24小时的不间断可用性及较快的系统反应时间，而不愿屡次看到某个站点&amp;ldquo;Server Too Busy&amp;rdquo;及频繁的系统故障。&lt;/p&gt;&lt;p&gt;随着业务量的提高,以及访问量和数据流量的快速增长，网络各个核心部分的处理性能和计算强度也相应增大，使得单一设备根本无法承担。在此情况下，如果扔掉现有设备去做大量的硬件升级，必将造成现有资源的浪费，而且下一次业务量的提升，又将导致再一次硬件升级的高额成本投入。于是，负载均衡机制应运而生。&lt;/p&gt;&lt;p&gt;对于负载均衡，笔者经常接触的当属Oracle的负载均衡机制。下面，我们先简单了解Oracle的负载均衡的实现方案。&lt;/p&gt;&lt;p&gt;Real Application Clusters是双机并行服务器(8i及以前版本称作Oracle Parallel Server，OPS)，用来在集群环境下实现多机共享数据库，以保证应用的高可用性，同时可以自动实现并行处理及均分负载，还能实现数据库在故障时的排错和无断点恢复。它可以自动进行负载平衡、故障修复和规划停机时间，以支持高可用性应用程序。若并行服务器中某节点失效，透明的应用程序容错能够把用户自动转接到另一节点上继续运行，应用程序在用户没有察觉的情况下继续执行。这使周期性和非周期性发生故障的系统增大了连续可用性。进程的失效可以完全透明地转移到另一节点上去，通过适当地配置，可以指定所有查询都在客户端进行缓存，这样它们便可以在转移后的节点上重新设置。&lt;/p&gt;&lt;p&gt;下面我们重点介绍Sql Server 2005是如何实现负载均衡的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Sql Server 2005的新特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;端到端拓扑的事务性复制&lt;/p&gt;&lt;p&gt;SQL Server 2005对端到端(P2P)拓扑结构上事务性的复制加强了支持。P2P的拓扑结构支持无限的发布服务器，它们彼此之间可以互相交换事务。&lt;/p&gt;&lt;p&gt;P2P拓扑是SQL Server的一个巨大进步。现在，多端点服务器可以更改数据，并且向其他的发布者复制事务。这就是说，订阅服务器不再被限制在主要的报告环境中，可以通过事务性负载全球共享的方式将服务器分布开来。当用户的数量增加的时候，只要简单地向这个群体中添加服务器即可。&lt;/p&gt;&lt;p&gt;除了将负载分布之外，这个拓扑结构还增加了可用性。如果任何一个点的服务器不可达，则池中其他服务器就会共享这个负载，因为每个服务器都有其他所有服务器上可获得的全部数据集合。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据库镜像和快照&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SQL Server 2005引入了数据库镜像的概念，来帮助获得高可用性。特别提醒的是，只要它正式发布了，数据库镜像就可以在SQL Server 2005上使用。然而，只有到SQL Server 2005 Service Pack 1才会支持镜像。&lt;/p&gt;&lt;p&gt;数据库快照是SQL Server 2005中引入的另一项特性。快照是某一个时间点上的数据库的克隆。只要对镜像数据库进行了快照，就可以让用户查询快照。快照的生成通常只需要几秒钟，因为它实际上在这个过程中并没有拷贝任何数据。因此，要把负载分布到主服务器和备用服务器上，就可以将数据库做镜像，然后阶段性地对备份服务器进行快照。而且还可以使用快照在主服务器上进行报告。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;软件实现SQL Server 2005的负载均衡&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;中间层&lt;/p&gt;&lt;p&gt;实现数据库的负载均衡技术，首先要有一个可以控制连接数据库的控制端。在这里，它截断了数据库和程序的直接连接，由所有的程序来访问这个中间层，然后再由中间层来访问数据库。这样，我们就可以具体控制访问某个数据库了，然后还可以根据数据库的当前负载来调整每次连接到哪个数据库。好处在两个方面:首先，它成功地将数据库放到了内网之中，更好地保护了数据库的安全性。如果数据库也在公网上，1433端口是很容易被攻击的，所以要保护数据库与之的连接，就用到了中间层。它可以将数据库更加好地保护在内网。其次，连接数据库的所有连接都可以控制，更方便DBA对数据的管理，看哪些连接更耗费数据库资源，以便更好地优化代码。&lt;/p&gt;&lt;p&gt;但是，也有两点要注意:第一，必须要做成Windows的服务程序。Windows发展到今天，如果以一个集成的大系统来讲，做成服务程序更加稳定，也更加安全，这样做即使用户不登录机器，也可以使用。第二，必须要使用多个中间层。从中间层的作用可以看出，它承接了数据库的所有连接，所以，一旦出了问题，就会导致整个系统瘫痪。所以做多个中间层是必要的，这样，如果一个坏了可以登录到另一个。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实现多据库数据同步&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;中间层有了，下一步的工作是设置构建数据库集群。对于负载均衡，最重要的就是所有服务器的数据都是同步的。这是一个集群所必需的，因为，如果数据不同步，那么用户从一台服务器读出的数据，就有别于从另一台服务器读出的数据，这是不能允许的。所以必须实现一个数据库的数据同步。这里设置一个用于写入的数据库，设置两个用于读出的数据库，因为据统计，一般来讲，70%的数据库操作为读操作。&lt;/p&gt;&lt;p&gt;首先，在写入数据库上做一个发布服务器，主要基于SQL Server 2005的复制技术，将即将用到的表都选上。注意，在连接上要选用模拟用户，然后共享时选择sa用户，这样就可以将数据共享了。&lt;/p&gt;&lt;p&gt;其次，在两个读服务器上做订阅服务，要注意同样的事项，这样一个&amp;ldquo;一写两读&amp;rdquo;的数据库集群就完成了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据库的安全备份&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在一个大的系统中，系统的无故障性是很重要的，但是在刚才的系统下，如果用于写的服务器突然坏了，整个系统就会出现问题，所以，再做个备份是必要的。&lt;/p&gt;&lt;p&gt;数据库镜像是SQL Server 2005大力推出的，它就是要实现数据库的安全转移，所以需要再单独拿出一台机器来做备份服务器，将完全镜像写入该服务器，这样，即使写入服务器坏了，它也可以自动转移到备份服务器上来，保证不影响用户。&lt;/p&gt;&lt;p&gt;这实际上就相当于实现了对服务器的容灾管理，但是有一点需要注意，在这种镜像的体系中，必须要有一台服务器作为监视服务器，以便察看哪台服务器坏了，用以在机器出错之后迅速调整。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;回传数据库的状态&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;数据库服务器均已配完，整体的机器集群架构已经构建，接下来的工作就是配置程序。&lt;/p&gt;&lt;p&gt;首先，在读和写的服务器都放上一个监控程序，它同样必须是Windows的服务，这样更稳定;其次，它可以设定成每隔30秒或者一定时间，将服务器的CPU、内存、网卡流量和当前数据库状态等信息发送回来。在这里需要设置一个权值，用以衡量CPU、内存利用率等信息的各自比例。在这个系统中，建议以CPU利用率为准。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;中间层实现的负载均衡&lt;/p&gt;&lt;p&gt;到此为止，所有的准备工作都已完成，包括数据库的建立和配置，中间层的位置，下面所作的就是用软件来实现这个负载均衡。&lt;/p&gt;&lt;p&gt;首先，当一个用户有数据库请求时，先判断是读还是写，如果是写的话，就直接返回写入服务器，这样当写服务器写完数据以后，差不多可以在3秒内返回其他两台机器。&lt;/p&gt;&lt;p&gt;其次，当遇到一个读的请求时，根据监控返回来的数据判断，根据刚才的权值返回一个当前最空闲的机器。需要注意的是，这时最好做一个记录器，用以保持一段时间的数值，可以让管理员自行设定，更好地做到几台数据库的压力平衡。&lt;/p&gt;&lt;p&gt;最后，如果为主的写入服务器突然坏掉，程序可以自动把备份的服务器切换过来，用刚才的备份服务器当作写服务器，然后做一个报警系统，用以通知管理员。同样，当监控服务器发现其他两台读服务器坏掉时，也会自动通知管理员，来处理服务器的异常情况，这样就可以保证系统的稳定运行，而且易于管理和维护。&lt;/p&gt;&lt;p&gt;总之，用软件和微软SQL Server 2005的一些新技术，可以很轻松地实现负载均衡，这样不但可以不用硬件来实现，方便管理员的操控，更有利于DBA管理数据库，及时发现问题。&lt;/p&gt;&lt;p&gt;&lt;img src="http://media.ccidnet.com/media/swm/img/282/06701t01.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;图1 数据库分布示意图&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2320814.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320814.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320218.html</id><title type="text">TFS 2010 自动化部署</title><summary type="text">1、TFS服务器：Team Foundation Administration Console –&gt; Build configuration ，修改 Build Service properties 的登录方式，改为可以访问TFS的账户。2、TFS客户端（另外的机器）：启动VS2010，TEAM Explorer，连接TFS。3、选择项目，创建生成定义：Build-&gt;New Build Definition。4、Trigger页面：选择此生成定义运行的事件，有五种方式。5、Build defaults页面，勾选copy功能，设置UNC path（应用服务器的路径，即站点所在的目录路</summary><published>2012-01-12T02:24:00Z</published><updated>2012-01-12T02:24:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320218.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320218.html"/><content type="html">&lt;p&gt;1、TFS服务器：Team Foundation Administration Console &amp;ndash;&amp;gt; Build configuration ，修改&amp;nbsp;&amp;nbsp;&amp;nbsp; Build Service properties 的登录方式，改为可以访问TFS的账户。&lt;br /&gt;2、TFS客户端（另外的机器）：启动VS2010，TEAM Explorer，连接TFS。&lt;/p&gt;&lt;p&gt;3、选择项目，创建生成定义：Build-&amp;gt;New Build Definition。&lt;br /&gt;4、Trigger页面：选择此生成定义运行的事件，有五种方式。&lt;/p&gt;&lt;p&gt;5、Build defaults页面，勾选copy功能，设置UNC path（应用服务器的路径，即站点所在的目录路径，需要TFS服务器有访问和修改该目录的权限）。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;6、Process页面：如果选择默认的BuildProcessTemplate文件，Build出来的结果是按照版本来生成目录，不便于自动部署到站点路径下。 这时需要创建新的BuildProcessTemplate文件（不建议修改自带的默认文件）。 然后修改新建的文件，找到Set Drop Location节点，右键查看属性，修改DropLocation的值，改为你需要部署的路径结构。如：默认是BuildDetail.DropLocationRoot + "\" + BuildDetail.BuildDefinition.Name + "\" + BuildDetail.BuildNumber 这个是带版本号的， 改为BuildDetail.DropLocationRoot + "\" + BuildDetail.BuildDefinition.Name的话，就不带版本号了，每次自动部署时，就会覆盖原来的目录。(不要更改 内部版本号格式)&lt;/p&gt;&lt;p&gt;7、以上，创建好生成定义，可以开始build，Build-&amp;gt;Queue New Build&amp;hellip;&lt;/p&gt;&lt;p&gt;8、双击运行的build可以查看进程。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以解决，部署版本问题。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2320218.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2012/01/12/2320218.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2011/12/12/2284988.html</id><title type="text">Cc.net的功能很强大</title><summary type="text">刚开始个新项目,需要个持续集成环境.下面简单说下用CCnet带搭建了Dailybuild环境:下面的文章是写在公司内部网上的,我直接copy过来,就不做什么修改了.花了1天多时间，构建好了Dailybuild环境，还有一些小问题，会不断改进。以下是我部署过程中的一些经验，大家有兴趣可以看看。Cc.net的功能很强大，我只用到了部分功能，大家有兴趣也可以自己研究研究。一、用到的工具(ア)CC.net（必须）：Dailybuild控制. 网址(イ)SCM（必须）：源代码下载.(其他VSS.SVN等)(ウ)MSBuild.exe（必须）：编译工具，framework自带，也可以用vs2008的命令行</summary><published>2011-12-12T08:25:00Z</published><updated>2011-12-12T08:25:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2011/12/12/2284988.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2011/12/12/2284988.html"/><content type="html">该文被密码保护。</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2011/12/01/2270682.html</id><title type="text">EPPlus Excel</title><summary type="text">EPPlus Excel 导出控件的使用2011-10-13 17:37:40|分类： Office文档操作 |标签： |字号大中小订阅开源地址: http://epplus.codeplex.com使用epplus 组件导出excel 时,针对已生成的excel 文件 替换速度比直接read excel 替换速度快很多, 另外也不需要去控制excel 中的格式.引用自:http://www.shaoqun.com/Article/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E9%80%9A%E8%BF%87EPPlus%E5%</summary><published>2011-12-01T07:38:00Z</published><updated>2011-12-01T07:38:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2011/12/01/2270682.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2011/12/01/2270682.html"/><content type="html">&lt;h3 class="title pre fs1"&gt;&lt;span class="tcnt"&gt;EPPlus Excel 导出控件的使用&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p class="tdep clearfix nbw-act fc06" style="line-height: 20px;"&gt;&lt;span class="pleft"&gt;&lt;span class="blogsep"&gt;2011-10-13 17:37:40&lt;/span&gt;&lt;span class="blogsep"&gt;|&amp;nbsp;&amp;nbsp;分类：&lt;/span&gt; &lt;a class="fc03 m2a" title="Office文档操作" href="http://chaoyueg.blog.163.com/blog/#m=0&amp;amp;t=1&amp;amp;c=fks_084066085084080070087095094095093081081069083085095065"&gt;Office文档操作&lt;/a&gt; &lt;span id="$_blogTagTitle" class="blogsep phide"&gt;|&amp;nbsp;&amp;nbsp;标签：&lt;/span&gt; &lt;/span&gt;&lt;span class="pright fc07 ztag"&gt;&lt;span class="blogsep"&gt;|&lt;/span&gt;&lt;span id="$_fontswitch" class="zihao fc03"&gt;字号&lt;span id="$_fontsTypes" class="zihaoshow  phide"&gt;&lt;span class="zihaoc bdc0"&gt;&lt;span class="fc04 stag"&gt;大&lt;/span&gt;&lt;span class="fc04 stag selected js-fcurrent fc05"&gt;中&lt;/span&gt;&lt;span class="fc04 stag"&gt;小&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="$_blog_subscribe" class="pright pnt fc03"&gt;&lt;span class="iblock icn0 icn0-919"&gt;&amp;nbsp;&lt;/span&gt;&lt;a class="m2a"&gt;订阅&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="nbw-blog-start"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="bct fc05 fc11 nbw-blog ztag js-fs2"&gt;&lt;p&gt;开源地址: &lt;a href="http://epplus.codeplex.com/" rel="nofollow"&gt;http://epplus.codeplex.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用epplus 组件导出excel 时,针对已生成的excel 文件 替换速度比直接read excel 替换速度快很多, 另外也不需要去控制excel 中的格式.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;引用自:http://www.shaoqun.com/Article/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E9%80%9A%E8%BF%87EPPlus%E5%AF%BC%E5%87%BAExcel%E6%96%87%E4%BB%B6.html&lt;/p&gt;&lt;p&gt;学习笔记&amp;mdash;&amp;mdash;通过EPPlus导出Excel文件&lt;br /&gt;2011/9/18 21:00:42&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 小弟刚刚走上工作岗位不久，工作中常常遇到要导出Excel的情况，但感觉两种常见的导出方式（一种是通过GridView，另一种是通过微软的COM组件）都不是很理想，前者导出的灵活度太低，后者又常常出现进程无法回收，所以一直想找个.net平台的第三方Excel组件，于是就在网上找到了EPPlus。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EPPlus是一个使用Open Office XML(xlsx)文件格式，能读写Excel 2007/2010 文件的开源组件，官网为：http://epplus.codeplex.com/。唯一的遗憾是我在网上没有找到有关这个组件的中文资料，我一直不清楚为什么，难道这个组件有什么大缺陷？还是目前还没在国内大量会用？反正我看了官网的介绍后感觉这个组件还是蛮好的，就决定先用它了。（如果这个组件有什么大缺陷，还请知情人士告诉我一下，省得我再花时间研究它了。）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面是一个简单的例子，通过EPPlus组件来导出一个Excel文件（首先添加EPPlus引用）。我是在页面放个button，Onclick事件处理函数如下：&lt;/p&gt;        //创建工作表&lt;br /&gt;        OfficeOpenXml.ExcelPackage ep = new OfficeOpenXml.ExcelPackage();&lt;br /&gt;        OfficeOpenXml.ExcelWorkbook wb = ep.Workbook;&lt;br /&gt;        OfficeOpenXml.ExcelWorksheet ws = wb.Worksheets.Add("我的工作表");&lt;br /&gt;//配置文件属性&lt;br /&gt;        wb.Properties.Category = "类别";&lt;br /&gt;        wb.Properties.Author = "作者";&lt;br /&gt;        wb.Properties.Comments = "备注";&lt;br /&gt;        wb.Properties.Company = "公司";&lt;br /&gt;        wb.Properties.Keywords = "关键字";&lt;br /&gt;        wb.Properties.Manager = "管理者";&lt;br /&gt;        wb.Properties.Status = "内容状态";&lt;br /&gt;        wb.Properties.Subject = "主题";&lt;br /&gt;        wb.Properties.Title = "标题";&lt;br /&gt;        wb.Properties.LastModifiedBy = "最后一次保存者";&lt;br /&gt;//写数据&lt;br /&gt;        ws.Cells[1, 1].Value = "Hello";&lt;br /&gt;        ws.Cells["B1"].Value = "World";&lt;br /&gt;        ws.Cells[3, 3, 3, 5].Merge = true;&lt;br /&gt;        ws.Cells[3, 3].Value = "Cells[3, 3, 3, 5]合并";&lt;br /&gt;        ws.Cells["A4:D5"].Merge = true;&lt;br /&gt;        ws.Cells["A4"].Value = "Cells[\"A4:D5\"]合并";&lt;br /&gt;//写到客户端（下载）&lt;br /&gt;        Response.Clear();&lt;br /&gt;        Response.AddHeader("content-disposition", "attachment;  filename=FileFlow.xlsx");&lt;br /&gt;        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";&lt;br /&gt;        Response.BinaryWrite(ep.GetAsByteArray());&lt;br /&gt;        //ep.SaveAs(Response.OutputStream);    第二种方式&lt;br /&gt;        Response.Flush();&lt;br /&gt;        Response.End();&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2270682.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2011/12/01/2270682.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2011/09/13/2174747.html</id><title type="text">DNS设置与管理</title><summary type="text">1、 安装DNS服务 开始—〉设置—〉控制面板—〉添加/删除程序—〉添加/删除Windows组件—〉“网络服务”—〉选择“域名服务系统（DNS）”—〉按确定进行安装 2、 创建DNS正相解析区域 开始—〉程序—〉管理工具—〉选择DNS，打开DNS控制台—〉右击“正相搜索区域”—〉选择“新建区域”—〉选择“标准主要区域”（或“Active Directory 集成区域”或“标准辅助区域”）--〉输入域名“abc.com” —〉输入要保存的区域的文件名“abc.com.dns”— 〉按完成，完成创建 创建主机记录等： 右击“abc.com”—〉“新建主机” —〉在名称处输入“www”，在“IP地址</summary><published>2011-09-13T07:06:00Z</published><updated>2011-09-13T07:06:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2011/09/13/2174747.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2011/09/13/2174747.html"/><content type="html">1、 安装DNS服务 &lt;br/&gt;&lt;br/&gt;开始&amp;mdash;〉设置&amp;mdash;〉控制面板&amp;mdash;〉添加/删除程序&amp;mdash;〉添加/删除Windows组件&amp;mdash;〉&amp;ldquo;网络服务&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;域名服务系统（DNS）&amp;rdquo;&amp;mdash;〉按确定进行安装 &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;2、 创建DNS正相解析区域 &lt;br/&gt;&lt;br/&gt;开始&amp;mdash;〉程序&amp;mdash;〉管理工具&amp;mdash;〉选择DNS，打开DNS控制台&amp;mdash;〉右击&amp;ldquo;正相搜索区域&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;新建区域&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;标准主要区域&amp;rdquo;（或&amp;ldquo;Active Directory 集成区域&amp;rdquo;或&amp;ldquo;标准辅助区域&amp;rdquo;）--〉输入域名&amp;ldquo;abc.com&amp;rdquo; &amp;mdash;〉输入要保存的区域的文件名&amp;ldquo;abc.com.dns&amp;rdquo;&amp;mdash; 〉按完成，完成创建 &lt;br/&gt;&lt;br/&gt;创建主机记录等： &lt;br/&gt;&lt;br/&gt;右击&amp;ldquo;abc.com&amp;rdquo;&amp;mdash;〉&amp;ldquo;新建主机&amp;rdquo; &amp;mdash;〉在名称处输入&amp;ldquo;www&amp;rdquo;，在&amp;ldquo;IP地址&amp;rdquo;处输入&amp;ldquo;192.168.0.3&amp;rdquo;，&amp;mdash;〉按&amp;ldquo;添加主机&amp;rdquo;完成 &lt;br/&gt;&lt;br/&gt;3、 创建DNS反向解析区域 &lt;br/&gt;&lt;br/&gt;开始&amp;mdash;〉程序&amp;mdash;〉管理工具&amp;mdash;〉选择DNS，打开DNS控制台&amp;mdash;〉右击&amp;ldquo;反向搜索区域&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;新建区域&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;标准主要区域&amp;rdquo;&amp;mdash;〉输入用来标示区域的&amp;ldquo;网络ID&amp;rdquo;&amp;mdash;〉输入要保存的区域的文件名&amp;ldquo;0.168.192.in-addr.arpa.dns&amp;rdquo;&amp;mdash;〉按完成，完成创建 &lt;br/&gt;&lt;br/&gt;创建指针PTR： &lt;br/&gt;&lt;br/&gt;右击&amp;ldquo;192.168.1.x.subnet&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;新建指针&amp;rdquo;&amp;mdash;〉在&amp;ldquo;主机IP号&amp;rdquo;中输入2&amp;mdash;〉在&amp;ldquo;主机名&amp;rdquo;中输入ftp&amp;mdash;按 &amp;ldquo;确定&amp;rdquo;完成添加 &lt;br/&gt;&lt;br/&gt;4、 启用DNS循环复用功能 &lt;br/&gt;&lt;br/&gt;如&lt;a href="http://www.abc.com/" target="_blank"&gt;www.abc.com&lt;/a&gt;对应于多个IP地址时DNS每次解析的顺序都不同 &lt;br/&gt;&lt;br/&gt;右击选择&amp;ldquo;DNS服务器&amp;rdquo;&amp;mdash;〉属性&amp;mdash;〉高级&amp;mdash;〉选择&amp;ldquo;启用循环&amp;rdquo;（round robin）--〉选择&amp;ldquo;启用netmask 排序&amp;rdquo;&amp;mdash;〉按&amp;ldquo; 确定&amp;rdquo;返回 &lt;br/&gt;&lt;br/&gt;注：如所有的IP和域名服务器在同一子网时需要取消&amp;ldquo;启用netmask排序&amp;rdquo;，才能实现循环复用功能。即启用循环时 ，当主机的IP和dns在同一个子网时将始终排在最前面，当都在一个子网时就不进行循环，只有去除了&amp;ldquo;启用netmask排序&amp;rdquo; 时才能实现循环复用。 &lt;br/&gt;&lt;br/&gt;DNS服务器会优先把与自己的网络ID相同的记录返回给客户端 &lt;br/&gt;&lt;br/&gt;5、 创建标准辅助区域，实现DNS区域复制 &lt;br/&gt;&lt;br/&gt;在另一台DNS服务器上，右击&amp;ldquo;正向搜索区域&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;新建区域&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;标准辅助区域&amp;rdquo;&amp;mdash;〉输入&amp;ldquo;abc.com&amp;rdquo;&amp;mdash;〉输入主域名服务器的IP地址&amp;mdash;〉选择&amp;ldquo;完成&amp;rdquo; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;可手工要求同步： &lt;br/&gt;&lt;br/&gt;在辅域名服务器上右击&amp;ldquo;abc.com&amp;rdquo;的域&amp;mdash;〉选择&amp;ldquo;从主服务器传输&amp;rdquo; &lt;br/&gt;&lt;br/&gt;并且可以设置允许传输的域名服务器： &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;在主域名服务器上右击&amp;ldquo;abc.com&amp;rdquo;的域&amp;mdash;〉选择&amp;ldquo;属性&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;区域复制&amp;rdquo;&amp;mdash;〉在&amp;ldquo;允许复制&amp;rdquo;前打勾，并选择允许复制的主机（到所有服务器、只有在&amp;ldquo;名称服务器&amp;rdquo;选项卡中列出的服务器、只允许到下列服务器） &lt;br/&gt;&lt;br/&gt;完成服务器类型的转换： &lt;br/&gt;&lt;br/&gt;右击区域&amp;mdash;〉选择 &amp;ldquo;属性&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;类型&amp;rdquo;的&amp;ldquo;更改&amp;rdquo;按钮&amp;mdash;〉选择要更改的区域类 型&amp;mdash;〉按&amp;ldquo;确定&amp;rdquo; &lt;br/&gt;&lt;br/&gt;6、 实现DNS唯高速缓存服务器 &lt;br/&gt;&lt;br/&gt;创建一个没有任何区域的DNS服务器&amp;mdash;〉右击DNS服务器&amp;mdash;〉选择&amp;ldquo;属性&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;转 发器&amp;rdquo;中的&amp;ldquo;启用转发器&amp;rdquo;&amp;mdash;〉输入转发器的IP地址&amp;mdash;〉按&amp;ldquo;确定&amp;rdquo;完成 &lt;br/&gt;&lt;br/&gt;清除&amp;ldquo;唯高速缓存&amp;rdquo;中的cache内容： &lt;br/&gt;&lt;br/&gt;右击&amp;ldquo;DNS服务器&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;清除缓存&amp;rdquo; &lt;br/&gt;&lt;br/&gt;或者选择&amp;ldquo;DNS服务器&amp;rdquo;&amp;mdash;〉在菜单中选择&amp;ldquo;查看&amp;rdquo;，高级&amp;mdash;〉右击&amp;ldquo;缓存的查找&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;清除缓存&amp;rdquo; &lt;br/&gt;（客户端清空DNS缓存&amp;mdash;）ipconfig /flushdns） &lt;br/&gt;&lt;br/&gt;7、 DNS的委派（子域的转向） &lt;br/&gt;&lt;br/&gt;在原域名服务器上建立&amp;ldquo;subdomain.abc.com&amp;rdquo;的主机&amp;mdash;〉右击abc.com的域，选择&amp;ldquo;新建委派&amp;rdquo;&amp;mdash;〉将subdomain.abc.com的域代理给subdomain.abc.com的主机&amp;mdash;〉在subdomain.abc.com上建立&amp;ldquo;正向标准区域&amp;rdquo;subdomain.abc.com&amp;mdash;〉添加相关主机记录 &lt;br/&gt;&lt;br/&gt;8、 设置 DNS区域的动态更新 &lt;br/&gt;&lt;br/&gt;右击选择DNS上区域&amp;mdash;〉选择&amp;ldquo;属性&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;常规&amp;rdquo;中的&amp;ldquo;允许动态更新&amp;rdquo;，选是&amp;mdash; 〉然后按 &amp;ldquo;确定&amp;rdquo;&amp;mdash;〉在本机的DHCP服务器中&amp;mdash;〉右击选择DHCP服务器&amp;mdash;〉选择&amp;ldquo;属性&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;DNS&amp;rdquo;&amp;mdash;〉选择&amp;ldquo;为不支持动态更新的DNS客户启用更新&amp;rdquo;&amp;mdash;〉在客户端使用ipconfig /registerdns来更新域名的注册信息 &lt;br/&gt;&lt;br/&gt;注意客户端需要将完整的计算机名改成myhost.abc.com &lt;br/&gt;&lt;br/&gt;9、 配置DNS客户端 &lt;br/&gt;&lt;br/&gt;在客户端计算机上打开tcp/ip属性对话框，在dns服务器地址栏输入dns服务器的ip地址 &lt;br/&gt;&lt;br/&gt;手工配置最多可配置12个 DNS服务器&lt;div class="reference mt10"&gt;参考资料：&lt;span class="gray"&gt;&lt;a href="http://zhidao.baidu.com/question/6822927.html" target="_blank"&gt;http://zhidao.baidu.com/question/6822927.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2174747.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2011/09/13/2174747.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2011/07/16/2108458.html</id><title type="text">C# 编辑Cookie</title><summary type="text">C#中的cookie编程 Cookie就是所谓的" 小甜饼" ,他最早出现是在Netscape Navigator 2.0中。Cookie其实就是由Web服务器创建的、将信息存储在计算机上的文件。那么为什么Web服务器要在客户机上面创建如此文件？这是因为当客户机发送一个请求到WEB服务器时（譬如准备浏览页面时），无论此客户机是否是第一次来访，服务器都会把它当作第一次来对待，WEB服务器所做的工作只是简单的进行响应，然后就关闭与该用户的连接。这样处理过程所带来的缺点时显而易见的。自从网景公司开发出Cookie以后，就可以利用Cookie来保存用户的识别信息。Cookie的作用</summary><published>2011-07-16T14:46:00Z</published><updated>2011-07-16T14:46:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2011/07/16/2108458.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2011/07/16/2108458.html"/><content type="html">&lt;p&gt;C#中的cookie编程 &lt;br /&gt;&lt;br /&gt;Cookie就是所谓的" 小甜饼" ,他最早出现是在Netscape Navigator 2.0中。Cookie其实就是由Web服务器创建的、将信息存储在计算机上的文件。那么为什么Web服务器要在客户机上面创建如此文件？这是因为当客户机发送一个请求到WEB服务器时（譬如准备浏览页面时），无论此客户机是否是第一次来访，服务器都会把它当作第一次来对待，WEB服务器所做的工作只是简单的进行响应，然后就关闭与该用户的连接。这样处理过程所带来的缺点时显而易见的。自从网景公司开发出Cookie以后，就可以利用Cookie来保存用户的识别信息。Cookie的作用可以记录了您在该站点上曾经访问过的页面，由此帮助您下次访问该站点时自定义查看。Cookies 也可以存储个人可识别信息。个人可识别信息是可以用来识别或联系您的信息，例如姓名、电子邮件地址、家庭或工作地址，或者电话号码。然而，网站只能访问您提供的个人可识别信息。例如，除非您提供电子邮件名称，否则网站将不能确定您的电子邮件名称。另外，网站不能通过Cookie来访问计算机上的其他信息。当然除非你提供。那么Cookie到底存放在什么地方？如果机器的系统是视窗98且安装在" C" 盘中，那么Cookie存放在" C:\Windows\Cookies" 目录中；如果机器系统是视窗2000且安装在" C" 盘中，那么Cookie存放在" C:\Documents and Settings\Administrator\Cookies" 目录中。了解了Cookie这么多知识，我们还是来了解一下本文的重点-- C#是如何进行Cookie方面编程的。主要内容有二点：其一是 C#是如何写入Cookie；其二是 C#是如何访问自己写入的Cookie。 &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;b&gt;一、本文介绍的程序设计和运行的软件环境：&lt;/b&gt;&lt;/ccid_nobr&gt; &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;ol&gt;&lt;li&gt;微软公司视窗2000服务器版&lt;/li&gt;&lt;li&gt;.Net FrameWork SDK Beta 2&lt;/li&gt;&lt;/ol&gt;&lt;/ccid_nobr&gt;&lt;br /&gt;&lt;br /&gt;C#进行Cookie方面编程是通过ASP.NET页面来实现的。 &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;b&gt;二、C#如何写入Cookie：&lt;/b&gt;&lt;/ccid_nobr&gt; &lt;br /&gt;&lt;br /&gt;为了写入Cookie，他的步骤主要有三步，具体如下： &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;ol&gt;&lt;li&gt;首先就要创建一个HttpCookie对象，通过这个对象来构造一个Cookie，这个对象的名称就是以后产生的Cookie名称。具体如下代码：&lt;br /&gt;HttpCookie cookie = new HttpCookie ( " 用户定义的Cookie名称" ) ;&lt;/li&gt;&lt;li&gt;然后对创建的HttpCookie对象的" Value" 属性分配一个字符串值，" Value" 的值就是后来产生的Cookie的值。具体代码如下：&lt;br /&gt;cookie.Value = "用户给Cookie赋值" ; 如果你想写入的Cookie数值不是一个简单的字符串，而是一个复杂的数据类型，我们知道这些数据类型是不能直接存贮到Cookie中的，因为Cookie中只能存贮字符串。但你可以通过一个变通的方法，就是把这个复杂的数据类型转换成多个字符串，然后把这多个字符串同时赋值给产生的Cookie值，这样Cookie中的内容就丰富了，以后利用Cookie完成的功能也强大了。这时你可能就会明白为什么当你浏览Web服务器，Web服务器会知道你什么时候曾经浏览过，并且曾经待过多长时间等信息了。因为这些信息已经存储到你第一次浏览页面时，Web服务器产生的Cookie中去了。下列代码是把多个字符串存储到Cookie的例子：&lt;br /&gt;cookie [ " 姓名" ] = " 王天";&lt;br /&gt;cookie [ " 性别" ] = " 男";&lt;br /&gt;cookie [ " 年龄" ] = " 26"; Cookie有临时的，也有永远的。永久 Cookie 以文件形式存储在计算机上，关闭 Internet Explorer 时仍然保留在计算机上。再次访问该站点时，创建该 Cookie 的网站可以读取。在具体的编程时候，是在写入此Cookie的时候，设定Cookie的生命周期，具体如下代码：&lt;br /&gt;DateTime dtNow = DateTime . Now ;&lt;br /&gt;TimeSpan tsMinute = new TimeSpan ( 0 , 1 , 0 , 0 ) ;&lt;br /&gt;cookie . Expires = dtNow + tsMinute ; 以上代码是设定产生的Cookie的生命期为" 一个小时" ，你可以通过修改" TimeSpan" 属性来设定产生Cookie的具体生命期。&lt;/li&gt;&lt;li&gt;.最后调用" Response.Cookies" 对象的" Add（）" 方法，加入此对象，这样就可以产生一个Cookie了。具体代码如下：&lt;br /&gt;Response . Cookies . Add ( cookie ) ;&lt;br /&gt;下列代码就是在 C#写入Cookie的完整代码（Write.aspx）：&lt;br /&gt;&amp;lt;% @ language = "C#" %&amp;gt;&lt;br /&gt;&amp;lt;script runat = "server" &amp;gt;&lt;br /&gt;void WriteClicked ( Object Sender , EventArgs e )&lt;br /&gt;{&lt;br /&gt;//创建一个HttpCookie对象&lt;br /&gt;HttpCookie cookie = new HttpCookie ( NameField . Text ) ;&lt;br /&gt;//设定此cookies值&lt;br /&gt;cookie . Value = ValueField . Text ;&lt;br /&gt;//设定cookie的生命周期，在这里定义为一个小时&lt;br /&gt;DateTime dtNow = DateTime . Now ;&lt;br /&gt;TimeSpan tsMinute = new TimeSpan ( 0 , 1 , 0 , 0 ) ;&lt;br /&gt;cookie . Expires = dtNow + tsMinute ;&lt;br /&gt;cookie [ "姓名" ] = "王天" ;&lt;br /&gt;cookie [ "性别" ] = "男" ;&lt;br /&gt;cookie [ "年龄" ] = "26" ;&lt;br /&gt;//加入此cookie&lt;br /&gt;Response . Cookies . Add ( cookie ) ;&lt;br /&gt;Response . Write ( NameField . Text + "Cookie创建完毕 &amp;lt;br &amp;gt; &amp;lt;hr &amp;gt; " ) ;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script &amp;gt;&lt;br /&gt;&amp;lt;html &amp;gt;&lt;br /&gt;&amp;lt;body &amp;gt; &lt;br /&gt;&amp;lt;h3 &amp;gt; 在 C#页面中创建cookie &amp;lt;/h3 &amp;gt;&lt;br /&gt;此cookie的生命周期定义为一个小时&lt;br /&gt;&amp;lt;form runat="server"&amp;gt;&lt;br /&gt;Cookie名称：&amp;lt;asp:textbox id = "NameField" runat = "server" /&amp;gt; &amp;lt;br &amp;gt;&lt;br /&gt;Cookie的值：&amp;lt;asp:textbox id = "ValueField" runat = "server" /&amp;gt; &amp;lt;br &amp;gt;&lt;br /&gt;&amp;lt;asp:button text = "创建Cookie" onclick = "WriteClicked" runat = "server" /&amp;gt; &amp;lt;br &amp;gt;&lt;br /&gt;&amp;lt;/form &amp;gt;&lt;br /&gt;&amp;lt;/body &amp;gt;&lt;br /&gt;&amp;lt;/html &amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ccid_nobr&gt;&lt;br /&gt;&lt;br /&gt;下图是上面代码运行后的界面： &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;center&gt;&lt;img src="http://developer.ccidnet.com/pub/attachment/2002/3/11371.gif" /&gt;&lt;br /&gt;图01：C#写入Cookie的程序运行界面&lt;/center&gt;&lt;/ccid_nobr&gt;&lt;br /&gt;&lt;br /&gt;当然上面的代码产生的Cookie在内容上面有点单调了。其实对于内容十分丰富的Cookie来说，他还有许多属性，充分的利用这些属性，才可以利用了Cookie的强大功能。下表是Cookie的一些常用的属性： &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="176"&gt;属性&lt;/td&gt;&lt;td width="570"&gt;描述&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="176"&gt;Domain&lt;/td&gt;&lt;td width="570"&gt;设定/获得Cookie应属于的域名。一旦设定了此属性，则只限定于此域名的Web服务器访问此Cookie。可以设定为"ccw.com.cn"&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="176"&gt;Path&lt;/td&gt;&lt;td width="570"&gt;设定/获得Cookie应属于的路径，如果设定后，则访问此Cookie的Web页面则被限定在此路径里面。其他路径的Web页面则不能访问。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="176"&gt;Secure&lt;/td&gt;&lt;td width="570"&gt;设定/获得一个标识来表明利用HTTP协议是否能够安全的传输Cookie到客户端的浏览器。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="176"&gt;HasKeys&lt;/td&gt;&lt;td width="570"&gt;表明是否此Cookie是否是多个字符串组成的。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/ccid_nobr&gt;&lt;br /&gt;&lt;br /&gt;在写入Cookie的时候，最大限度的利用这些属性，对于最大程度的利用写入的Cookie是十分重要的。 &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;b&gt;三、C#是如何读取已产生的Cookie：&lt;/b&gt;&lt;/ccid_nobr&gt; &lt;br /&gt;&lt;br /&gt;读取指定的Cookie比起写入Cookie要来的容易的多了，只需要使用" Request.Cookies" 对象就可以完成。下面是读取指定Cookie名称的方法： &lt;br /&gt;&lt;br /&gt;HttpCookie cookie = Request.Cookies [ " Cookie的名称" ] ; &lt;br /&gt;&lt;br /&gt;下面是显示已经读取了的Cookie的数值： &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="code" bgcolor="#e6e6e6"&gt;Response.Write (cookie . Value . ToString ( ) ) ; 掌握了上面的要点，读取Cookie就显得非常容易了，下列是读取Cookie的程序代码（read.aspx）： &amp;lt;% @ language = "C#" %&amp;gt;&lt;br /&gt;&amp;lt;script runat = "server" &amp;gt;&lt;br /&gt;void ReadClicked ( Object Sender , EventArgs e )&lt;br /&gt;{&lt;br /&gt;//得到用户输入的cookie名称&lt;br /&gt;String strCookieName = NameField . Text ;&lt;br /&gt;//获得cookie&lt;br /&gt;HttpCookie cookie = Request.Cookies [ strCookieName ] ;&lt;br /&gt;//确定是否存在用户输入的cookie&lt;br /&gt;if ( null == cookie ) {&lt;br /&gt;Response.Write ( "没有发现指定的cookie &amp;lt;br &amp;gt; &amp;lt;hr &amp;gt; " ) ;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;//找到指定的cookie，显示cookie的值&lt;br /&gt;String strCookieValue = cookie . Value . ToString ( ) ;&lt;br /&gt;Response.Write ( strCookieName + " cookie 的值为: &amp;lt;b &amp;gt; " &lt;br /&gt;+ strCookieValue + " &amp;lt;/b &amp;gt; &amp;lt;br &amp;gt; &amp;lt;hr &amp;gt; " ) ;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script &amp;gt;&lt;br /&gt;&amp;lt;html &amp;gt;&lt;br /&gt;&amp;lt;body &amp;gt;&lt;br /&gt;在 C#页面中读取指定Cookie值&amp;lt;br &amp;gt;&lt;br /&gt;&amp;lt;form runat = "server" &amp;gt;&lt;br /&gt;请输入要读取的Cookie名称：&amp;lt;asp:textbox id = "NameField" runat = "server" /&amp;gt;&lt;br /&gt;&amp;lt;asp:button text = "读取cookie" onclick = "ReadClicked" runat = "server" /&amp;gt;&lt;br /&gt;&amp;lt;/form &amp;gt;&lt;br /&gt;&amp;lt;/body &amp;gt;&lt;br /&gt;&amp;lt;/html &amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/ccid_nobr&gt;&lt;br /&gt;&lt;br /&gt;下图是上面代码运行后的界面： &lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;center&gt;&lt;img src="http://developer.ccidnet.com/pub/attachment/2002/3/11372.gif" /&gt;&lt;br /&gt;图02：读取指定Cookie的值的程序运行界面&lt;/center&gt;&lt;p&gt;&lt;/p&gt;&lt;/ccid_nobr&gt;&lt;br /&gt;&lt;br /&gt;&lt;ccid_nobr&gt;&lt;b&gt;四、总结：&lt;/b&gt;&lt;/ccid_nobr&gt; &lt;br /&gt;&lt;br /&gt;至此我们已经介绍了用 C#进行Cookie编程的大部分内容。其实Cookie在互联网上有着比较大的作用。譬如它可让WEB站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径等；还可告诉在线广告商广告被点击的次数，从而可以更精确的投放广告；它可让用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点；最为重要的是它可帮助站点统计用户资料以实现个性化服务等等。掌握了 C#的Cookie编程，就可以在程序中充分利用Cookie来实现上面的这些功能了。不信你试一试。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2108458.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2011/07/16/2108458.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2011/07/04/2097562.html</id><title type="text">变量List实例化和Clear的区别</title><summary type="text">关键看黄色背景处的代码，原来的程序是 valuename.clear();您知道会出现什么情况吗？ 为什么呢？valuename 是引用类型对象，industryList.Add之后 valuename.clear ，industryList的value为空。而valuename 重新实例化之后，就是一个新对象 string keyName = string.Empty; List&lt;string&gt; valueName =new List&lt;string&gt;(); foreach (DataRow row in dt.Rows) { string tempkey = row[</summary><published>2011-07-04T08:49:00Z</published><updated>2011-07-04T08:49:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2011/07/04/2097562.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2011/07/04/2097562.html"/><content type="html">&lt;p&gt;关键看黄色背景处的代码，原来的程序是 valuename.clear();&lt;/p&gt;&lt;p&gt;您知道会出现什么情况吗？ 为什么呢？&lt;/p&gt;&lt;p&gt;valuename 是引用类型对象，industryList.Add之后 valuename.clear ，industryList的value为空。&lt;/p&gt;&lt;p&gt;而valuename 重新实例化之后，就是一个新对象&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; keyName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;                List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; valueName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataRow row &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; dt.Rows)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; tempkey &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; row[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ToString();&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; tempvalue &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; row[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SonName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ToString();&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (keyName &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tempkey&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;valueName.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                            industryList.Add(keyName, valueName);&lt;br /&gt;                            &lt;span style="background-color: #ffff00;"&gt;valueName &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: #ffff00;"&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;span style="background-color: #ffff00;"&gt;();&lt;/span&gt;&lt;br /&gt;                    }&lt;br /&gt;                    keyName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tempkey;&lt;br /&gt;                    valueName.Add(tempvalue);&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (valueName.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    industryList.Add(keyName, valueName);&lt;br /&gt;                }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2097562.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2011/07/04/2097562.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2011/06/23/2087775.html</id><title type="text">TFS2010安装方法</title><summary type="text">安装过程： 一、安装操作系统 安装Windows 2008 R2简体中文版 二、准备安装过程中的需要的用户账户，并设置相应权限 具体流程如下： 1、点击“开始”——“管理工具”——“计较机管理” 2、选择“本地用户和组”——“用户”，在右边空白处点击右键，选择“新用户” 3、 分别添加名为TFSREPORTS、TFSSERVICE、TFSBUILD、TFSPROXY、WSSSERVICE、SQLSERVICE并为各个账户设置密码，同时根据相应需求调整选项（比如首届登录不需更改密码、密码不外期之类的） 4、点击“开始”——“管理工具”——“本地安全策略”，在左边选择“本地策略”——“用户权限分配</summary><published>2011-06-23T01:24:00Z</published><updated>2011-06-23T01:24:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2011/06/23/2087775.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2011/06/23/2087775.html"/><content type="html">&lt;p&gt;安装过程：&lt;/p&gt;&lt;p&gt;一、安装操作系统&lt;/p&gt;&lt;p&gt;安装Windows 2008 R2简体中文版&lt;/p&gt;&lt;p&gt;二、准备安装过程中的需要的用户账户，并设置相应权限&lt;/p&gt;&lt;p&gt;具体流程如下：&lt;/p&gt;&lt;p&gt;1、点击&amp;ldquo;开始&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;管理工具&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;计较机管理&amp;rdquo;&lt;/p&gt;&lt;p&gt;2、选择&amp;ldquo;本地用户和组&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;用户&amp;rdquo;，在右边空白处点击右键，选择&amp;ldquo;新用户&amp;rdquo;&lt;/p&gt;&lt;p&gt;3、 分别添加名为TFSREPORTS、TFSSERVICE、TFSBUILD、TFSPROXY、WSSSERVICE、SQLSERVICE并为各个账户设置密码，同时根据相应需求调整选项（比如首届登录不需更改密码、密码不外期之类的）&lt;/p&gt;&lt;p&gt;4、点击&amp;ldquo;开始&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;管理工具&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;本地安全策略&amp;rdquo;，在左边选择&amp;ldquo;本地策略&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;用户权限分配&amp;rdquo;，再在右边找到&amp;ldquo;允许本地登录&amp;rdquo;，左键双击之，选择&amp;ldquo;添加用户或组&amp;rdquo;，添加TFSREPORTS用户&lt;/p&gt;&lt;p&gt;5、添加完毕后再找到&amp;ldquo;作为服务登录&amp;rdquo;，同样方法添加TFSSERVICE、TFSBUILD、TFSPROXY三个用户&lt;/p&gt;&lt;p&gt;三、安装IIS 7.0&lt;/p&gt;&lt;p&gt;1、点击&amp;ldquo;开始&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;管理工具&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;服务器管理器&amp;rdquo;，在右边找到&amp;ldquo;添加角色&amp;rdquo;选择&amp;ldquo;Web 服务器(IIS)&amp;rdquo;，点击下一步&lt;/p&gt;&lt;p&gt;2、选择具体功能时添加ASP.NET、Windows身份验证、IIS6管理兼容性三个必选功能&lt;/p&gt;&lt;p&gt;3、确认并安&lt;b&gt;&lt;span&gt;&lt;a href="http://ccolon.net/tag/%E5%AE%89%E8%A3%85%E5%BA%8F%E5%88%97%E5%8F%B7" target="_blank"&gt;安装序列号&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;装&lt;/p&gt;&lt;p&gt;四、安装SQL Server 2008&lt;/p&gt;&lt;p&gt;1、运行安装程序，输入各种东西，选择各种东西&lt;/p&gt;&lt;p&gt;2、在功能选择页面上，必须选择的有&amp;ldquo;数据库引擎服务&amp;rdquo;、&amp;ldquo;全文搜索&amp;rdquo;、&amp;ldquo;Analysis Services&amp;rdquo;、&amp;ldquo;Reporting Services&amp;rdquo;、&amp;ldquo;客户端工具连接&amp;rdquo;、&amp;ldquo;管理工具-基本&amp;rdquo;&lt;/p&gt;&lt;p&gt;3、实例设置中要是没有存在默认实例就是用默认实例吧，也可以选择命名实例&lt;/p&gt;&lt;p&gt;4、服务器设置页面上选择&amp;ldquo;对所有SQL Server 服务使用相同的帐户&amp;rdquo;，在账户名中输入&amp;ldquo;NT AUTHORITY\NETWORK SERVICE&amp;rdquo;，密码留空&lt;/p&gt;&lt;p&gt;5、在数据引擎设置页面中，选择&amp;ldquo;Windows身份验证标准样式&amp;rdquo;，选择&amp;ldquo;添加当前用户&amp;rdquo;&lt;/p&gt;&lt;p&gt;6、在Analysis Services 设置页面中，选择&amp;ldquo;添加当前用户&lt;/p&gt;&lt;p&gt;7、在Reporting Services 设置页面中，选择&amp;ldquo;安装本机标准样式默认设置&amp;rdquo;&lt;/p&gt;&lt;p&gt;8、接下来的就自己摆平啦&lt;/p&gt;&lt;p&gt;五、安装SQL Server 2008 SP1补钉&lt;/p&gt;&lt;p&gt;六、安装TFS 2010&lt;/p&gt;&lt;p&gt;1、运行安装程序&lt;/p&gt;&lt;p&gt;2、输入序列号（刮开文章末梢的序列号）&lt;/p&gt;&lt;p&gt;3、各种接受、各种下一步&lt;/p&gt;&lt;p&gt;4、等候安装完成&lt;/p&gt;&lt;p&gt;5、最后在完成页面选中&amp;ldquo;启动Team Foundation Server 设置工具&amp;rdquo;复选框&lt;/p&gt;&lt;p&gt;七、设置TFS 2010（以高级设置为例）&lt;/p&gt;&lt;p&gt;1、在&amp;ldquo;设置SQL Server实例&amp;rdquo;页面，输入SQL Server服务器的名称(要是使用了命名实例还需要输入实例&lt;b&gt;&lt;span&gt;&lt;a href="http://ccolon.net/tag/%E5%AE%89%E8%A3%85%E5%BA%8F%E5%88%97%E5%8F%B7" target="_blank"&gt;安装序列号&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;名称)&lt;/p&gt;&lt;p&gt;2、在服务器数据库标签中输入标签字符串（可选）&lt;/p&gt;&lt;p&gt;3、点击测试，测试一下与SQL Server的链接&lt;/p&gt;&lt;p&gt;4、在&amp;ldquo;服务账户&amp;rdquo;页面，裸机是用用户账户，填入TFSSERVICE，并输入密码&lt;/p&gt;&lt;p&gt;5、在&amp;ldquo;身份验证方法&amp;rdquo;页面（有时候可能没有），选择NTLM，当然也可以选择&amp;ldquo;协商&amp;rdquo;（要是支持的话）&lt;/p&gt;&lt;p&gt;7、在&amp;ldquo;IIS虚拟目次&amp;rdquo;，输入虚拟目次名称（默认为tfs），这与是用客户端连接到TFS时的设置密切相关&lt;/p&gt;&lt;p&gt;8、在&amp;ldquo;设置Team Foundation Server 的报告&amp;rdquo;的页面，选中&amp;ldquo;设置用于Team Foundation Server 的报告&amp;rdquo;复选框，下一步&lt;/p&gt;&lt;p&gt;9、在&amp;ldquo;Reporting Services 实例&amp;rdquo;中填入Reporting Services的服务器名称&lt;/p&gt;&lt;p&gt;十、在&amp;ldquo;SQL Analysis Services 实例&amp;rdquo;中填入SQL Analysis Services的服务器的名称&lt;/p&gt;&lt;p&gt;11、选择&amp;ldquo;测试&amp;rdquo;，以测试与SQL服务器的连接&lt;/p&gt;&lt;p&gt;12、在&amp;ldquo;设置用于Team Foundation Server 的SharePoint&amp;rdquo;页面中，选中&amp;ldquo;设置用于Team Foundation Server 的SharePoint&amp;rdquo;复选框，下一步&lt;/p&gt;&lt;p&gt;13、选择&amp;ldquo;在场标准样式中安装Windows SharePoint Services 3.0&amp;rdquo;，选择&amp;ldquo;对SharePoint 场使用Team Foundation Server 服务帐户之外的帐户&amp;rdquo;，填入WSSSERVICE用户以及对应的密码，下一步&lt;/p&gt;&lt;p&gt;14、选中&amp;ldquo;创建新的团队项目集合&amp;rdquo;复选框，以创建默认团队项目集合&lt;/p&gt;&lt;p&gt;15、在最后的检查页面检查一下设置，完成后选择下一步&lt;/p&gt;&lt;p&gt;16、点击&amp;ldquo;设置&lt;b&gt;&lt;span&gt;&lt;a href="http://ccolon.net/tag/%E5%AE%89%E8%A3%85%E5%BA%8F%E5%88%97%E5%8F%B7" target="_blank"&gt;安装序列号&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&amp;rdquo;，等候完成&lt;/p&gt;&lt;p&gt;17、好吧，恭喜你，你已经成功设置TFS 2010了&lt;/p&gt;&lt;p&gt;18、不要忘了感谢我一下&lt;/p&gt;&lt;p&gt;八、设置TFS Build服务、设置TFS Proxy服务基本上很简单，不再赘述在选择服务用户时分别填入TFSBUILD和TFSPROXY，并提供相应密码&lt;/p&gt;&lt;p&gt;九、创建团队成员账户、进行安全设置后成员就可以访问TFS 2010服务器进行团队开发了&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2087775.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2011/06/23/2087775.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Fly-sky/archive/2011/06/10/2077809.html</id><title type="text">强类型dll</title><summary type="text">问题DotNet平台下提供了比较完备的类库，但是第一个版本总归不可能面面俱到，而且由于历史遗留问题，经常会和COM/ActiveX的组件之间进行互操作。笔者碰到的问题就是在一个Assembly中调用到了Excel的对象，但是该Assembly需要封装成为一个ActiveX的Control，供IE的客户端脚本调用。简而言之，我在C#中用到了一个COM组件，还需要把自己封装成一个COM组件，听起来有点多余不过想不到更好的办法。在这样的封装模式下碰到了一个问题，如果一个Assembly希望封装成为ActiveX/COM组件，那么它必须拥有强名（Strong Name），也就是说在编译的时候需要指定S</summary><published>2011-06-10T09:07:00Z</published><updated>2011-06-10T09:07:00Z</updated><author><name>大宇Dayu</name><uri>http://www.cnblogs.com/Fly-sky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Fly-sky/archive/2011/06/10/2077809.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Fly-sky/archive/2011/06/10/2077809.html"/><content type="html">问题&amp;nbsp;&lt;br /&gt;DotNet平台下提供了比较完备的类库，但是第一个版本总归不可能面面俱到，而且由于历史遗留问题，经常会和COM/ActiveX的组件之间进行互操作。&amp;nbsp;&lt;br /&gt;笔者碰到的问题就是在一个Assembly中调用到了Excel的对象，但是该Assembly需要封装成为一个ActiveX的Control，供IE的客户端脚本调用。简而言之，我在C#中用到了一个COM组件，还需要把自己封装成一个COM组件，听起来有点多余不过想不到更好的办法。&amp;nbsp;&lt;br /&gt;在这样的封装模式下碰到了一个问题，如果一个Assembly希望封装成为ActiveX/COM组件，那么它必须拥有强名（Strong &amp;nbsp; Name），也就是说在编译的时候需要指定SNK（Strong &amp;nbsp; Name &amp;nbsp; Key）。但是当一个Assembly如果以拥有强名的方式编译的话，它又要求所以自身所引用的其他Assembly都必须拥有强名，否则不能够成功编译。而当我们在工程中直接引用一个COM组件（例如：Excel &amp;nbsp; 10 &amp;nbsp; Object &amp;nbsp; Library），VS.Net能够帮助我们自动导入类型库，但是此时的引用类型库是没有强名的，在笔者所期望的环境下无法编译成功。&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;解决&amp;nbsp;&lt;br /&gt;碰到这个问题觉得很棘手，似乎陷入和死循环，不过查阅一下文档，发现还是非常容易解决的，DotNet &amp;nbsp; Framework中提供了相应的工具能够转换COM的类型库，他就是TlbImp.exe（大家可以在类似&amp;ldquo;C:\Program &amp;nbsp; Files\Microsoft &amp;nbsp; Visual &amp;nbsp; Studio &amp;nbsp; .NET &amp;nbsp; 2003\SDK\v1.1&amp;rdquo;的目录中找到）。TlbImp能够将一个COM组件包装成为DotNet可以使用的类库的形式，VS.Net的自动转换想必也是以来这个工具。该工具有很多参数开关，需要支持强名只要额外打开一个开关即可。一下介绍笔者认为最可能用到的参数：&amp;nbsp;&lt;br /&gt;/out:Filename：类型库转换之后输出文件的名称。&amp;nbsp;&lt;br /&gt;/namespace:Namespace：类型库转换所使用的名称空间。&amp;nbsp;&lt;br /&gt;/keyfile:FileName：指定转换时使用的SNK文件，指明该参数，构造之后的类型库就拥有了强名。&amp;nbsp;&lt;br /&gt;完整的例子如下：&amp;nbsp;&lt;br /&gt;tlbimp &amp;nbsp; excel.exe &amp;nbsp; /out:interop.excel.dll &amp;nbsp; /namespace:Excel &amp;nbsp; /keyfile:excel.snk&amp;nbsp;&lt;br /&gt;其中snk文件可以通过DotNet中的另一个工具SN生成，此处不再赘述。&amp;nbsp;&lt;br /&gt;完成上述工作，在工程中直接引用我们自己构造的类型库，就可以成功的编译拥有强名的DLL了。&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;如果是控件，而不是普通的Component，那么就不能够使用tlbimp，而需要使用aximp.exe这个工具，使用方法与tlbimp类似，他会生成两个文件：一个是类型库的代理文件，另一个是Windows &amp;nbsp; Form的代理文件。&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;进一步解决&amp;nbsp;&lt;br /&gt;然而还有更加简单的解决办法，就是在工程属性中设置&amp;ldquo;Wrapper &amp;nbsp; Assembly &amp;nbsp; Key &amp;nbsp; File&amp;rdquo;（Common &amp;nbsp; Properties\General\Wrapper &amp;nbsp; Assembly &amp;nbsp; Key &amp;nbsp; File），这个属性。设置了该属性之后通过Add &amp;nbsp; Reference添加的COM/ActiveX组件，都将被标识，拥有强名。&amp;nbsp;&lt;br /&gt;这需要一次设置就可以了，应该更加方便。&lt;img src="http://www.cnblogs.com/Fly-sky/aggbug/2077809.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Fly-sky/archive/2011/06/10/2077809.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
