<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_新生命开发团队</title><subtitle type="text">我不相信神话，我只相信汗水！我不相信命运，我只相信双手！QQ群：1600800</subtitle><id>http://feed.cnblogs.com/blog/u/23151/rss</id><updated>2011-12-02T02:19:08Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/23151/rss"/><entry><id>http://www.cnblogs.com/nnhy/archive/2011/11/12/2246805.html</id><title type="text">坚持之随想</title><summary type="text">昨晚做了一个梦，很长！梦到回到大学时代，我跟很多一样年纪的人，“潜入”（抱歉，实在没有更好的词）清华大学计算机系。并且我们这些冒牌跟正规清华学生一起上课。后来因为“潜入”的人实在太多，是正规生的两三...</summary><published>2011-11-12T14:29:00Z</published><updated>2011-11-12T14:29:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/11/12/2246805.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/11/12/2246805.html"/><content type="html">&lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 昨晚做了一个梦，很长！梦到回到大学时代，我跟很多一样年纪的人，“潜入”（抱歉，实在没有更好的词）清华大学计算机系。并且我们这些冒牌跟正规清华学生一起上课。后来因为“潜入”的人实在太多，是正规生的两三倍之多，我们被校长（Or系主任）领到一个广场，包括正规生，还做了一个不短的演讲。他肯定了我们这些外来者的梦想，讲述了正规生是如何坚持不懈的努力然后进入清华。当我们所有人都在想将会受到什么样的处罚的时候，他最后说了一句：坚持你们的梦想！然后离开，我们所有人都懵了，不知道什么意思，是让我们留还是让我们走？随后，大家都笑了！（结局不再重要，不是吗？）&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 刚看《非诚勿扰》，其中一个男嘉宾，来自深圳，自己业余时间都花在小时候梦想上——造飞机。我心里发笑，好俗的梦想，想着很多人都不会真去做。画面切到一个车间，他在操作机床切割飞机支架。此时，正喝着熬了一个晚上的骨头汤，差点就喷出来！了不起！真了不起！他居然能独立设计并制造出来，还能稳稳的飞起来，这期间肯定吃了不少苦头！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们每一个人，小时候都一定有一个非常了不起的梦想，老师，医生，科学家……但又有多少人能实现自己的梦想？或者说从事梦想相关的工作？甚至梦想不变的呢？恐怕不到万分之一吧！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我小学的梦想是当科学家，到了中学，就细化到物理学和生物学，上了大学，确定到了计算机，算是物理数学混合体吧。其实我也一直没有放弃自己的梦想。算是阴差阳错吧，初一时虽然受到班主任的坚决反对，但命运让我以候补的角色进入到计算机兴趣班。高一接触网络，同时开始学编程，更重要的是认识了几个有浓厚计算机的朋友，包括我们年轻的电脑课老师。因此，本来我高考志愿只有核能工程一项，后来加填了计算机科学，并且先被这个专业录取了。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我还是很爱核能工程，爱核聚变，最爱可控冷聚变。随着年纪渐长，感觉离自己的梦想越来越远，难道真的是放弃了吗？说不清楚，其实也没必要清楚。也许将来等我积累了足够的实力，我还是回来的！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 说现在，其实从知道被录取到计算机科学专业后，就一直在这一行混，就快十年了！我甚至从未想过换行业，不知道这算不算是坚持呢？现在就想让更多的人能用上便宜好用的软件，也让我们做开发的兄弟姐妹能活得更精彩！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff00ff"&gt;又想起，这些年来，所见到的许许多多开发者的牢骚——累，心累！&lt;/font&gt;大骂MS技术变更太快；唠叨总是学不会多线程编程；鄙视ASP.Net WebForm杂乱；愤恨Silverlight可能的消失……&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MS技术要不是不断更新，也许早就没落了，推陈出新，这是永恒不变的道理。逆水行舟，不进则退！身为开发者，如果不能与时俱进坚持学习，不断提升自己，就等着被历史所淹没吧；&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 多线程编程，看书看明白了又能如何？许多人本身就是冲着它的好处而来的，而从来就没有考虑过它带来的线程安全、资源争夺、WinForm界面线程等许多问题。并且，这些问题是光看书或者光看代码就能学会的吗？&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebForm是足够复杂、庞大、杂乱的，但是话说回来，恐怕80%以上的人都是都是以此为入口，进入ASP.Net的吧？即使是现在用MVC的朋友，也不见得就很厉害。只要是没经过认真学习，不懂Http原理的，基本上也不会懂ASP.Net原理；但只要懂ASP.Net原理的，也不至于鄙视WebForm。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不坚持下去，拥有更多的经历，有什么资格发牢骚呢？一些学了三五天就希望小有所成的朋友，我建议你能静下心来坚持下去，如果做不到，趁早改行吧！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;从99年学QB和ASP算起，我有12年的编程生涯，现在也敢厚着脸皮说我是一名普通程序员。面对学了两三年就自诩架构师的人，我感到汗颜！如若10年后你还在这一行，那么我打心底里佩服你，为了你的坚持！&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;正因为，坚持很难做到，所以坚持所能得到的特别可贵！&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2246805.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/11/12/2246805.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/10/30/2229444.html</id><title type="text">Oracle免客户端For .Net（增加分析Devart和DataDirect）</title><summary type="text">我只是一名普通的.Net开发人员，常用SqlServer，偶尔用其它数据库，属于能连上然后select/execute就行的那种。但就是我这么小的愿望，在面对Oracle时都很难实现。 虽然04年...</summary><published>2011-10-30T11:17:00Z</published><updated>2011-10-30T11:17:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/10/30/2229444.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/10/30/2229444.html"/><content type="html">&lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我只是一名普通的.Net开发人员，常用SqlServer，偶尔用其它数据库，属于能连上然后select/execute就行的那种。但就是我这么小的愿望，在面对Oracle时都很难实现。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 虽然04年就开始用Oracle开发项目，但每次遇到问题总是胡乱弄一下，能用就行。这次又遇到问题，更离谱的是：同一个版本的NewLife.XCode，同一台机器，同一个ODP.Net版本，上个月写的程序工作好好的，怎么折腾都能用，刚刚新写的一个，怎么写都不行！于是，决心彻底的解决这个问题，共耗时三天三夜（熬夜到凌晨一两点）。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们知道，用.Net链接Oracle数据库，有两个驱动，一个是.Net自带的，一个是Oracle开发的ODP.Net（&lt;a href="http://www.oracle.com/technetwork/cn/database/windows/downloads/index-101312-zhs.html" target="_blank"&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;）（要注册，后面提供一个我们团队的下载地址）。而.Net自带那个，MS早就不支持不更新了，于是一般开发都会用ODP.Net。并且，.Net自带的驱动，必须用TNS方式连接数据库，而不能用这种：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.34)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORC)));User ID=admin;Password=admin;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 否则报错：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff00ff"&gt;&lt;strong&gt;连接选项“Data Source”的长度无效，最大长度为 128&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 开发支持Oracle的.Net程序，标准流程是先安装Oracle客户端，然后使用.Net自带驱动或者ODP.Net。其实只要按照这个流程来做，基本上不会有错误，要错也只是TNS错而已。而最令人忍受不了的就是，Oracle客户端实在是无比庞大，尽管后来可以只安装Oracle客户端运行时，仍然很大。于是，就有高手制作精简版客户端，这个网上很多，效果也非常不错。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当然啦，Oracle官方也没闲着，推出了InstantClient，不到30M的msi安装程序。总算是摆脱了那个巨大的客户端。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但是，人的欲求是无止境的！有了更小的运行时，为了方便，我们还希望能做到免安装，伴随着我们开发的主程序拷贝过去就能用。经过多方求证，Oracle客户端运行时的关键在于OCI，也就是说，不管用什么语言写的程序，只要能找到运行时的oci.dll，基本上就能链接Oracle数据库了。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 通过反编译ODP.Net里面的Oracle.DataAccess.dll发现，它会先找注册表，然后是配置文件，从中找一些设置，第一个就是DllPath，我估计这个就是OCI的路径。于是备份了InstantClient安装后的文件，然后把它卸载了，并确保注册表没有残留。释放备份的文件，在项目配置文件里面指定路径：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201110/201110301915265837.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201110/20111030191531882.png" width="807" height="213"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;实际上是增加一个段：&lt;/font&gt;&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;configSections&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;section &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;oracle.dataaccess.client&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;System.Data.Common.DbProviderConfigurationHandler, System.Data,  Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;&#xD;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;configSections&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&lt;font size="4"&gt;&lt;/font&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;然后再设置DllPath：&lt;/font&gt;&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;oracle.dataaccess.client&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;settings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;DllPath&lt;/span&gt;" &lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;D:\Oracle\OCI&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;&#xD;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;settings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;oracle.dataaccess.client&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;让测试代码跑起来，一切正常！这说明，只要能找到oci.dll所在目录，程序就可以正常工作。当然，如果把这个目录的文件直接放到软件目录中，也是可以使用的。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;到这里，习惯的想，只要把那些安装后的文件拷贝走，就可以使用了。但打包的时候才发现，InstantClient的安装文件虽然不到30M，但是安装之后足足139M（下图实际上是最新的驱动2.112.2.0，网上的InstantClient是2.112.1.0，两者文件基本一样）：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201110/201110301915414252.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201110/201110301915504931.png" width="613" height="759"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;图中可以看到，罪魁祸首是oraociei11.dll这个，它就占了126M。上网搜索各种Oracle客户端精简方案，必要的几个文件：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;oci.dll、orannzsbb11.dll、oraocci11.dll、oraociei11.dll，它是必不可少的呀……&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;当然，还有两个：Oracle.DataAccess.dll、OraOps11w.dll，有些安装包会把OraOps11w.dll跟OCI放在一起，也是可以的。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201110/201110301916014058.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201110/2011103019161278.png" width="606" height="442"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;伤不起呀！这几个文件就127M了，最高压缩，也有30M，并且解压还特别慢！（这个压缩包后面提供下载）&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;难道除了这个就没办法更小了吗？不是的！朋友告诉我一个很小的运行时oracle9i310（网上有扣积分下载，后面提供本地下载），才13M，不过需要安装。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;但是这个运行时比较难缠，如果用最新的Oracle.DataAccess.dll去连接，会报版本不匹配！&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;（这里插一段关于版本不兼容的说明）&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#ff00ff" size="4"&gt;&lt;strong&gt;The provider is not compatible with the version of Oracle client&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#ff00ff" size="4"&gt;&lt;strong&gt;提供程序与此版本的 Oracle 客户机不兼容&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;这个可是开发.Net For Oracle程序中最常见的错误了。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;实际上，这是使用ODP.Net经常遇到的问题，在ODP.Net中，Oracle.DataAccess.dll=&amp;gt;OraOps11w.dll=&amp;gt;oci.dll，前面两者的版本必须100%匹配（OraOps11w.dll里面通过硬编码写死了的）（也许这就是Oracle官方把OraOps11w.dll跟Oracle.DataAccess.dll放在一起的原因）。后面两者的版本似乎要求不高，是C++之间的引用。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;而.Net的Oracle驱动，版本要求就非常低了，只要能找到oci.dll，基本上就能很好工作，它不会去检查版本什么的。如果找不到oci.dll呢，就会报这个错误：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#ff00ff" size="4"&gt;&lt;strong&gt;System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;当然，光有OCI目录（在环境变量Path中设置）不行，还得设置环境变量ORACLE_HOME为OCI目录，否则报错（因为oci.dll要用别的dll）：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#ff00ff" size="4"&gt;&lt;strong&gt;OCIEnvCreate 失败，返回代码为 -1，但错误消息文本不可用。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;言归正传！&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;最新的ODP.Net驱动无法使用oracle9i310运行时，那么试试MS的。设置环境变量ORACLE_HOME为oracle9i310目录，在环境变量Path中添加其下的bin目录（oci.dll在里面）。测试正常！这表明，9i运行时支持绿色发布。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;下一步，就应该是开始精简这个oracle9i310了。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201110/201110301916252072.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201110/20111030191638685.png" width="592" height="446"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;不到13M的安装包，安装后只有35M，远远比最新的ODP.Net驱动要小，压缩后不到9M。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;删除一些不必要的东西后，剩下28M，压缩得到6.5M。这应该算是最小的Oracle客户端运行时了。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;综合比较：&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="2" width="800"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;&#xD;
&lt;p align="center"&gt;.Net自带Oracle驱动&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;&#xD;
&lt;p align="center"&gt;ODP.Net驱动&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;连接字符串TNS写法&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;支持&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;支持&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;连接字符串非TNS写法&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;不支持&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;支持&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;是否支持Oracle9运行时&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;支持&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;不支持&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;是否支持Oracle11运行时&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;支持&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;支持&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;OCI目录设置方式&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;环境变量Path中设置&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;环境变量Path中设置&lt;br&gt;或&lt;br&gt;配置文件设置DllPath&lt;br&gt;或&lt;br&gt;注册表设置DllPath&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;其它环境变量&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;需要设置ORACLE_HOME &lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;无&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;运行时安装包大小&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;9i运行时安装包13M&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;11g运行时安装包30M&lt;br&gt;最新ODP.Net共52M&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;绿色精简后大小&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;9i运行时6.5M&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;11g运行时30M&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;据说的差别&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;性能底下，功能特性少&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;性能最高，功能特性多&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&#xD;
&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;下载地址：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;&lt;a href="http://nnhy.cnblogs.com" target="_blank"&gt;Oracle9i客户端运行时精简版 6.5M&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;&lt;a href="http://nnhy.cnblogs.com" target="_blank"&gt;Oracle11g客户端运行时精简版 30M&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#0000ff" size="5"&gt;&lt;strong&gt;&lt;a href="http://nnhy.cnblogs.com" target="_blank"&gt;Oracle9i客户端运行时原版 13M&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#0000ff" size="5"&gt;&lt;strong&gt;&lt;a href="http://nnhy.cnblogs.com" target="_blank"&gt;Oracle11g客户端运行时原版 52M&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;(下载地址随时可能变更,以最新群公告为准!)&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font size="4"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;FTP承受不了，增加网盘共享：&lt;/p&gt;&#xD;
&lt;p&gt;9i精简版：&lt;a title="http://www.kuaipan.cn/file/id_2378544298602218.html" href="http://www.kuaipan.cn/file/id_2378544298602218.html"&gt;http://www.kuaipan.cn/file/id_2378544298602218.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;11g精简版：&lt;a title="http://www.kuaipan.cn/file/id_2378544298602215.html" href="http://www.kuaipan.cn/file/id_2378544298602215.html"&gt;http://www.kuaipan.cn/file/id_2378544298602215.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;9i原版：&lt;a title="http://www.kuaipan.cn/file/id_2378544298602216.html" href="http://www.kuaipan.cn/file/id_2378544298602216.html"&gt;http://www.kuaipan.cn/file/id_2378544298602216.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;11g原版：&lt;a title="http://www.kuaipan.cn/file/id_2378544298602217.html" href="http://www.kuaipan.cn/file/id_2378544298602217.html"&gt;http://www.kuaipan.cn/file/id_2378544298602217.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（FTP严重影响了服务器网络，现在已经关闭）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;后续：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.devart.com/" target="_blank"&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;Devart dotConnect for Oracle&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在&lt;a href="http://www.cnblogs.com/onecool/" target="_blank"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;OneCool&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;和&lt;a href="http://www.cnblogs.com/xiaopang2010/" target="_blank"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;小胖2010&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;的推荐下，分析&lt;a href="http://www.devart.com/" target="_blank"&gt;Devart&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;1，采用名称混淆，分析有一定难度&lt;/p&gt;&#xD;
&lt;p&gt;2，采用Lic授权，很脆弱&lt;/p&gt;&#xD;
&lt;p&gt;3，发现调用OCI.DLL，发现处理Home等环境变量，看来还是离不开oci.dll&lt;/p&gt;&#xD;
&lt;p&gt;综评，跟ODP.Net比，没有优势，并且还是收费的（也有免费版）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.datadirect.com" target="_blank"&gt;&lt;strong&gt;&lt;font color="#ff0000" size="5"&gt;DataDirect&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在园友&lt;a href="http://www.cnblogs.com/wizardwu" target="_blank"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;wizardwu&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;的&lt;a href="http://www.cnblogs.com/wizardwu/archive/2010/05/17/1737009.html" target="_blank"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;一篇博客&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;中发现了这个家伙。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201110/201110311738358161.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201110/20111031173840665.png" width="538" height="644"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;1，产品说明非常吸引人，唯一一个100%托管代码数据提供者，不需要Oracle OCI客户端库。对，这就是我们梦寐以求的！&lt;/p&gt;&#xD;
&lt;p&gt;2，最新版本是3.5，需要申请试用。上午10点，发动群友，采用各种国内外邮箱、IP、VPN申请，均无法收到邮件。下午3点收到，开始下载。&lt;/p&gt;&#xD;
&lt;p&gt;3，上午从CSDN找到一个2.1的版本（For .Net 1.0），未混淆，采用Lic授权，支持OEM，自写的对称加密算法，内置没有任何处理的密码，很脆弱&lt;/p&gt;&#xD;
&lt;p&gt;4，从2.1版本中很清楚的看到数据封包解包，网络发送和接收的过程。没有见到任何跟OCI和HOME有关的东西。可以肯定，这是纯托管代码且不需要OCI的。&lt;/p&gt;&#xD;
&lt;p&gt;5，下午分析3.5（For .Net 2.0/4.0），名称混淆，也是Lic授权。看到类的布局，还有各个命名空间，不需要分析下去了。&lt;/p&gt;&#xD;
&lt;p&gt;综评，没错，&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;这就是我们所需要的极品，强烈推荐！！！&lt;/strong&gt;&lt;/font&gt;没找到价格，似乎必须跟他们联系。时间不多，没有做运行测试，我想网上有很多报告的！&lt;/p&gt;&#xD;
&lt;p&gt;其中2.1版，关于Oracle、SqlServer、Sybase、DB2的封包，非常具有参考价值！&lt;/p&gt;&#xD;
&lt;p&gt;2.1版下载：&lt;a title="http://www.kuaipan.cn/file/id_2378544298602742.html" href="http://www.kuaipan.cn/file/id_2378544298602742.html"&gt;http://www.kuaipan.cn/file/id_2378544298602742.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.5版下载：&lt;a title="http://www.kuaipan.cn/file/id_2378544298602758.html" href="http://www.kuaipan.cn/file/id_2378544298602758.html"&gt;http://www.kuaipan.cn/file/id_2378544298602758.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2229444.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/10/30/2229444.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/09/08/2171078.html</id><title type="text">【求助】测试XCode v8.0的正向反向功能</title><summary type="text">目的：测试XCode v8.0的正常反向功能。 正向工程：从数据库读取架构信息，生成实体类。 反向工程：根据实体类的特性构造架构信息，反向生成数据库或者修改数据库。 准备工作： 1，自备数据库实例，最好是自己的数据库，为了测试各种数据库的各种字段能否被识别为正确的.Net类型（正向工程），同时也测试.Net类型能否正确转为对应的数据库类型（反向工程）。（支持MSSQL、Access、SqlCe、S...</summary><published>2011-09-08T02:52:00Z</published><updated>2011-09-08T02:52:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/09/08/2171078.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/09/08/2171078.html"/><content type="html">&lt;p&gt;目的：测试XCode v8.0的正常反向功能。&lt;/p&gt; &lt;p&gt;正向工程：从数据库读取架构信息，生成实体类。&lt;/p&gt; &lt;p&gt;反向工程：根据实体类的特性构造架构信息，反向生成数据库或者修改数据库。&lt;/p&gt; &lt;p&gt;准备工作：&lt;/p&gt; &lt;p&gt;1，自备数据库实例，最好是自己的数据库，为了测试各种数据库的各种字段能否被识别为正确的.Net类型（正向工程），同时也测试.Net类型能否正确转为对应的数据库类型（反向工程）。（支持MSSQL、Access、SqlCe、SQLite、MySql、Oracle、PostgreSQL、Firebird）&lt;/p&gt; &lt;p&gt;2，最新的XCoder v4.2一份&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;开始：&lt;/p&gt; &lt;p&gt;1，在XCoder.exe.config中配置连接字符串，如果没有这个文件，运行一次XCoder即可自动生成。XCoder能自动发现本机MSSQL，本目录Access和SQLite。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052116871.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052115476.png" width="1004" height="151"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;2，启动后的主界面。连接那里下拉选择的就是前面配置的连接。检查模版那里是否有模版可选择。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052112444.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052113001.png" width="750" height="392"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;3，选择要测试的连接字符串，点“连接”。此时XCoder通过XCode取得数据库架构，拿到了所有表信息，并在数据表那里列出来。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052113557.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052128922.png" width="749" height="390"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;4，先备份一下架构信息，留后面使用。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052126447.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052128640.png" width="857" height="606"&gt;&lt;/a&gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052121181.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052137626.png" width="758" height="392"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;5，选择“实体”模版，点击“生成所有表”，0.3秒即可生成12个实体类。点击“打开目录”可以直接看到。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052134071.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052132708.png" width="750" height="392"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052146645.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052143854.png" width="856" height="604"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;6，新建一个控制台项目，引用NewLife.Core.dll和XCode.dll（可以从代码生成器里面拿到）。并把刚才生成所有实体类拷贝进去。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052142774.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052143331.png" width="221" height="690"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;7，再添加一个应用配置App.Config。加上一些配置信息。我们生成实体类的时候，设置了连接名为Common，这个配置文件里面本应该配置一个名为Common的连接，但是我们通过XCode的连接名映射功能把Common这个连接名映射到别的连接名上去。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052141728.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052154792.png" width="1246" height="533"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;8，写几句代码试一试。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052153397.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052152317.png" width="651" height="349"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;9，修改连接字符串，开始测试反向工程。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052152873.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052155382.png" width="1164" height="200"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;10，重新启动程序。运行结果没什么变化，只是慢了一点点。其实，这是因为我们指定了一个并不存在的数据库Common888，同时配置文件里面打开了反向工程的开关XCode.Schema.Enable，XCode自动创建数据库和数据表。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/20110908105215398.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052159003.png" width="1183" height="883"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;11，检查一下数据库里面的字段，看看字段类型是否与本来的数据库类型一致。同时检查索引是否能够正确创建。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052157923.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/20110908105216431.png" width="211" height="332"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;12，测试不同数据库间的兼容性。比如从MSSQL生成实体类，然后反向工程生成到SQLite中去。这方面可以多做几个测试。测试人员之间也可以互相交换数据库架构信息（第4步导出），用XCoder导入也可以生成实体类。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052169036.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052168512.png" width="652" height="405"&gt;&lt;/a&gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052167433.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109081052167989.png" width="503" height="303"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;XCode的类型对应基于ADO.Net，但是大量存在一种.Net类型对应多种数据库类型的情况，我们只能做很小的一部分测试，不能保证各种类型的字段都能得到正确识别。&lt;/p&gt; &lt;p&gt;各个需要附加DLL的数据库提供者，会自动下载！&lt;/p&gt; &lt;p&gt;目前XCode对各个数据库的兼容性情况排名：MSSQL2008/2005》MSSQL2000》Access》SQLite》Oracle》MySql》SqlCe》PostgreSQL》Firebird，越是后面，可能存在的问题就越多。&lt;/p&gt; &lt;p&gt;至于正向反向工程以外的问题，可以通过把项目指定到不同类型的数据库上进行测试。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;测试过程中遇到的各种问题，在群里反馈，实时修正各种BUG。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;测试相关资料下载地址：&lt;a href="http://xcode.codeplex.com/releases/view/73026" target="_blank"&gt;&lt;font color="#ff0000" size="6"&gt;&lt;strong&gt;http://xcode.codeplex.com/releases/view/73026&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2171078.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/09/08/2171078.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/09/01/2161804.html</id><title type="text">XCode中如何使用事务</title><summary type="text">废话不多说，直接上代码： // try之前开始事务 Meta.BeginTrans(); try{ // do something // 强烈建议，尽可能做到只有一次提交事务，以免混乱 Meta.Commit(); } catch{ // 出错了，需要回滚事务 Meta.Rollback(); // 继续向外抛出异常 throw; } XCode还支持多级事务，实际上，除了第一级事务是真实的事...</summary><published>2011-09-01T03:53:00Z</published><updated>2011-09-01T03:53:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/09/01/2161804.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/09/01/2161804.html"/><content type="html">&lt;p&gt;废话不多说，直接上代码： &lt;p&gt;// try之前开始事务 &lt;p&gt;Meta.BeginTrans(); &lt;p&gt;try{ &lt;p&gt;// do something &lt;p&gt;// 强烈建议，尽可能做到只有一次提交事务，以免混乱 &lt;p&gt;Meta.Commit(); &lt;p&gt;} &lt;p&gt;catch{ &lt;p&gt;// 出错了，需要回滚事务 &lt;p&gt;Meta.Rollback(); &lt;p&gt;// 继续向外抛出异常 &lt;p&gt;throw; &lt;p&gt;} &lt;p&gt;XCode还支持多级事务，实际上，除了第一级事务是真实的事务外，第一级以上的事务全部都是事务计数器加一减一而已，BeginTrans加一，Commit和Rollback减一，减到0时执行真正的提交或回滚。 &lt;p&gt;这个多级事务实现比较简单，只考虑了常见的情况。 &lt;p&gt;&lt;p&gt;XCode地址：http://xcode.codeplex.com &lt;p&gt;BTW，提前Show一下&lt;strong&gt;&lt;font color="#ff0000" size="6"&gt;NewLife.XCode v8.0&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;1，扩展了的数据模型 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153266748.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="XR_(FRF[TNJPNLMWC(XAR%E" border="0" alt="XR_(FRF[TNJPNLMWC(XAR%E" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153261241.jpg" width="1401" height="884"&gt;&lt;/a&gt; &lt;p&gt;2，增加索引和表关系特性，自动生成扩展属性&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153276257.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153273226.png" width="653" height="579"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;3，另一边也是有扩展属性的&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153271830.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153277162.png" width="755" height="819"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;4，根据索引可以生成扩展查询（在考虑优化为自动采用实体缓存）&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153272179.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201109/201109011153277752.png" width="691" height="784"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2161804.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/09/01/2161804.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/08/16/2140479.html</id><title type="text">在XCode中如何使用高级查询</title><summary type="text">对于一个框架来说，仅有基本的CURD不行，NewLife.XCode同时还提供了一个非常宽松的方式来使用高级查询，以满足各种复杂的查询需求。(本文同样适用于其它任何数据访问框架)初衷是跟大家交流技术，让大家都掌握这些应用开发经验，而不是让大家都来用XCode！有了这些东西，你也可以做出来自己的XCode！</summary><published>2011-08-16T04:54:00Z</published><updated>2011-08-16T04:54:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/08/16/2140479.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/08/16/2140479.html"/><content type="html">&lt;p&gt;对于一个框架来说，仅有基本的CURD不行，NewLife.XCode同时还提供了一个非常宽松的方式来使用高级查询，以满足各种复杂的查询需求。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="5"&gt;(本文同样适用于其它任何数据访问框架)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;先上图看一个复杂查询的效果图：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253525363.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253538611.png" width="1024" height="693"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;这里有8个固定的查询条件和1个模糊查询条件，加上多表关联（7张表）、分页、统计，如果用传统的做法，这个查询会非常的复杂。&lt;/p&gt; &lt;p&gt;这个页面有XCode实现，核心查询部分共100多行代码，包括一个查询、一个总记录数分页、两个统计（就是业绩、提成等的统计），看看高级查询代码：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253549592.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253554510.png" width="1074" height="799"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;可以看到，关键就在SearchWhere里面，另外四个方法，都是调用它，它的作用，就是为了构造一个where字句。&lt;/p&gt; &lt;p&gt;XCode不支持多表关联（v7开始测底不支持，以前的支持太鸡肋，几乎从未使用），这种涉及多表关联的查询，就需要子查询来代替了，看看SearchWhere：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253568871.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253579328.png" width="1058" height="823"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253587277.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253597734.png" width="1071" height="634"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;可以看到，除了UserRelation外，基本都是通过子查询来实现关联查询。而UserRelation是用户关系表，数据比较固定，采用了二级实体缓存，对它的查询几乎不会形成数据库查询，缓存命中率不低于99%。&lt;/p&gt; &lt;p&gt;在各个小片段上使用MakeCondition格式化数据，保证这些代码能根据当前数据库生成相应的语句，使得系统能支持多数据库。比如时间日期类型，在MSSQL是单引号边界，在Access是井号边界。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;回过头来，看看前端页面是怎么做的，查询条件区域：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161253592652.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161254006490.png" width="805" height="279"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;这里用了好些用户自定义控件，便于多个地方重用。&lt;/p&gt; &lt;p&gt;再看看ObjectDataSource是怎么配置的：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161254012487.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201108/201108161254022736.png" width="775" height="404"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;ObjectDataSource负责把查询区域的控件跟后台查询方法的参数，给绑定起来，并且支持分页查询，让前台页面，不需要写代码，就实现了高级分页查询。&lt;/p&gt; &lt;p&gt;并且，后台的那些查询方法，同样适用于非ObjectDataSource的前台，也适用于WinForm等应用系统之中！&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;NewLife.XCode下载地址：&lt;a href="http://XCode.codeplex.com"&gt;http://XCode.codeplex.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;没有很完整的教程，只有本博客中的点点滴滴！初衷是跟大家交流技术，让大家都掌握这些应用开发经验，而不是让大家都来用XCode！有了这些东西，你也可以做出来自己的XCode！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2140479.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/08/16/2140479.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/07/26/2117054.html</id><title type="text">【求助】小系统组成大系统所遇到的问题</title><summary type="text">以下只是举例！ 环境： 1，通用实体库CommonEntity，里面有管理员类 class Administrator&amp;lt;TEntity&amp;gt; : Entity&amp;lt;TEntity&amp;gt;, IAdministrator where TEntity:Administrator&amp;lt;TEntity&amp;gt;{ static TEntity Login(String username, String password); st...</summary><published>2011-07-26T04:04:00Z</published><updated>2011-07-26T04:04:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/07/26/2117054.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/07/26/2117054.html"/><content type="html">&lt;p&gt;以下只是举例！&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="5"&gt;环境：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1，通用实体库CommonEntity，里面有管理员类 &lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;class Administrator&amp;lt;TEntity&amp;gt; : Entity&amp;lt;TEntity&amp;gt;, IAdministrator where TEntity:Administrator&amp;lt;TEntity&amp;gt;{&lt;/p&gt; &lt;p&gt;static TEntity Login(String username, String password);&lt;/p&gt; &lt;p&gt;static IAdministator FindByID(Int32 id);&lt;/p&gt; &lt;p&gt;static IAdministator FindByName(String name);&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;这是一个泛型类，然后有个默认的管理员类&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;class Administrator:Administrator&amp;lt;Administrator&amp;gt;{}&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;可别晕了，尖括号里面的Administrator就是左边的那个类，而尖括号前那个，是上面那个泛型类。上面可以看到，我们还有一个IAdministator接口。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;2，请假模块。业务逻辑部分针对IAdministrator编程，因为不知道最终类型，没办法利用Administrator&amp;lt;TEntity&amp;gt;进行编码。&lt;/p&gt; &lt;p&gt;3，出差模块。同上，只对IAdministator进行编码。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;4，最终项目。它要扩展管理员类，于是有&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;class Admin:Administrator&amp;lt;Admin&amp;gt;{&lt;/p&gt; &lt;p&gt;public String Address{get;set;}&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;这个扩展的管理员类，多了一个地址Address字段。&lt;/p&gt; &lt;p&gt;这个时候，需要把请假模块和出差模块集成进来，而这两个模块，根本不需要关心扩展的Address字段，因为它们只需要用到基类里面的那些字段和方法就足够了，但是那两个模块里面用的是IAdministator接口所代表的对象，必须是最终扩展的这个Admin类，而不是通用实体库CommonEntity里面的Administrator，否则会出很大的问题，例如它们俩是不同的数据表。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="5"&gt;现状：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1，目前采用的方法。请假和出差模块使用Administrator类（不是泛型那个），如IAdministator admin=Administrator.FindByID(123)。这个FindByID里面，读取配置文件，得知真正的管理员类是Admin，然后反射调用它的方法，所以最终得到的admin实际上是Admin的实例，而不是Administator的。&lt;/p&gt; &lt;p&gt;2，上面的方法解决了问题，但是还有很多问题。管理员类只是一个例子，还有很多其它的类需要这样做，都这样子使用配置，最后统一起来，就会奇臭无比。&lt;/p&gt; &lt;p&gt;3，假如还有一个模块，考勤模块，需要用到请假和出差，然后它又要扩展请假和出差……（你懂的！）&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;求助：&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;求一个漂亮的解决方案！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2117054.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/07/26/2117054.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/05/31/2065198.html</id><title type="text">GridView绑定小技</title><summary type="text">1，使用表达式。如下，缺货的产品用红色，别的绿色。 实际上，就这个表达式：(Int32)Eval(&amp;quot;Num&amp;quot;)&amp;lt;(Int32)Eval(&amp;quot;MinNum&amp;quot;)?System.Drawing.Color.Red:System.Drawing.Color.Green2，属性成员。这是产品订购记录，有产品编号ProductID，扩展属性Product，单位在产品类中。 注意Product.UnitName那...</summary><published>2011-05-31T13:53:00Z</published><updated>2011-05-31T13:53:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/05/31/2065198.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/05/31/2065198.html"/><content type="html">&lt;p&gt;1，使用表达式。如下，缺货的产品用红色，别的绿色。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201105/201105312152127238.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201105/20110531215228222.png" width="881" height="433"&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201105/201105312152347087.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201105/201105312152369887.png" width="886" height="191"&gt;&lt;/a&gt;  &lt;p&gt;实际上，就这个表达式：&lt;pre&gt;(Int32)Eval("Num")&amp;lt;(Int32)Eval("MinNum")?System.Drawing.Color.Red:System.Drawing.Color.Green&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2，属性成员。这是产品订购记录，有产品编号ProductID，扩展属性Product，单位在产品类中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201105/201105312152397082.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201105/201105312152439542.png" width="512" height="296"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201105/201105312152491914.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201105/201105312152514747.png" width="729" height="155"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;注意Product.UnitName那里&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2065198.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/05/31/2065198.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/05/18/2050004.html</id><title type="text">如何遍历维数和各维上限未定的多维数组</title><summary type="text">这个题目，不方便使用递归！ 直觉告诉我，可以用两层遍历，外面一层是维数，里面一层是每一维。但实际上，要做起来很难！ 最后决定最外层循环用元素个数，里面配合使用维数的循环，最终解决问题！ static void ArrEnum(Array arr, Action&amp;lt;Int32[]&amp;gt; func){ Int32[] ix = new Int32[arr.Rank]; Int32 rank = 0; for...</summary><published>2011-05-18T06:20:00Z</published><updated>2011-05-18T06:20:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/05/18/2050004.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/05/18/2050004.html"/><content type="html">&lt;p&gt;这个题目，不方便使用递归！&lt;/p&gt; &lt;p&gt;直觉告诉我，可以用两层遍历，外面一层是维数，里面一层是每一维。但实际上，要做起来很难！&lt;/p&gt; &lt;p&gt;最后决定最外层循环用元素个数，里面配合使用维数的循环，最终解决问题！&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;ArrEnum(&lt;span style="color: #2b91af"&gt;Array &lt;/span&gt;arr, Action&amp;lt;&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;[]&amp;gt; func)&#xD;
{&#xD;
    &lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;[] ix = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;[arr.Rank];&#xD;
    &lt;span style="color: #2b91af"&gt;Int32 &lt;/span&gt;rank = 0;&#xD;
&#xD;
    &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; arr.Length; i++)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// 当前层以下都清零&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;j = rank + 1; j &amp;lt; arr.Rank; j++)&#xD;
        {&#xD;
            ix[j] = 0;&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 设置为最底层&#xD;
        &lt;/span&gt;rank = arr.Rank - 1;&#xD;
&#xD;
        &lt;span style="color: green"&gt;//do something&#xD;
        //arr.SetValue(i, ix);&#xD;
        &lt;/span&gt;func(ix);&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 当前层递加&#xD;
        &lt;/span&gt;ix[rank]++;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 如果超过上限，则减少层次&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;while &lt;/span&gt;(ix[rank] &amp;gt;= arr.GetLength(rank))&#xD;
        {&#xD;
            rank--;&#xD;
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(rank &amp;lt; 0) &lt;span style="color: blue"&gt;break&lt;/span&gt;;&#xD;
            ix[rank]++;&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&#xD;
&lt;span style="color: blue"&gt;static void &lt;/span&gt;Test2()&#xD;
{&#xD;
    &lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;[, , ,] arr = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;[24, 24, 24, 24];&#xD;
&#xD;
    &lt;span style="color: #2b91af"&gt;Int32 &lt;/span&gt;n=1;&#xD;
    ArrEnum(arr, ix =&amp;gt; arr.SetValue(n++, ix));&#xD;
    ArrEnum(arr, &lt;span style="color: blue"&gt;delegate&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;[] ix)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: #a31515"&gt;"["&lt;/span&gt;);&#xD;
        &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; ix.Length; i++)&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(i &amp;gt; 0) &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: #a31515"&gt;", "&lt;/span&gt;);&#xD;
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(ix[i]);&#xD;
        }&#xD;
        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: #a31515"&gt;"]\t"&lt;/span&gt;);&#xD;
        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(arr.GetValue(ix));&#xD;
    });&#xD;
}&#xD;
&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2050004.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/05/18/2050004.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/04/18/2019751.html</id><title type="text">求长度的另一种方法(&amp;quot;&amp;quot;+obj).Length</title><summary type="text">ASP.Net页面绑定时，标题超过20则省略，常规做法： Eval(&amp;quot;Title&amp;quot;)==null?&amp;quot;&amp;quot;:(Eval(&amp;quot;Title&amp;quot;).ToString().Length&amp;lt;=20?Eval(&amp;quot;Titl...</summary><published>2011-04-18T05:18:00Z</published><updated>2011-04-18T05:18:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/04/18/2019751.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/04/18/2019751.html"/><content type="html">&lt;p&gt;ASP.Net页面绑定时，标题超过20则省略，常规做法：&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="4"&gt;Eval("Title")==null?"":(Eval("Title").ToString().Length&amp;lt;=20?Eval("Title").ToString():Eval("Title").ToString().Substring(0,17)+"…")&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我先说结果，看看我们在ASP时代常用的手段：&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="4"&gt;(""+Eval("Title")).Length&amp;lt;=20?(""+Eval("Title")):(""+Eval("Title")).Substring(0,17)+"…"&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;嗯，我的表达有些糟糕，其实我是想说明一种方法，避免判断null，又能避免ToString的，那就是&lt;font color="#ff0000" size="5"&gt;""+obj&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;然后就有同学不同意，觉得这个用法很不好，并且obj不是String时有null异常，并且性能也不好……&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们来一个测试&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/20110418131759316.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="`13a~d_[njq[ndvma`ir{ua" border="0" alt="`13a~d_[njq[ndvma`ir{ua" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104181317597808.jpg" width="299" height="173"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104181317591712.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="u7{{jb]%]x]n`k~8k~nhm}3" border="0" alt="u7{{jb]%]x]n`k~8k~nhm}3" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104181317592792.jpg" width="262" height="162"&gt;&lt;/a&gt; &lt;p&gt;这个说明，obj不是String时，并没有null异常。 &lt;p&gt;&lt;p&gt;我们看看后面那个的IL &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/20110418131759283.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="dua~isaw2t9m{h48b(%pc]x" border="0" alt="dua~isaw2t9m{h48b(%pc]x" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104181317591363.jpg" width="385" height="291"&gt;&lt;/a&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;实际上，编译器处理过了，类似：&lt;font color="#ff0000" size="5"&gt;String.Concat(obj)&lt;/font&gt;，注意了，这里是一个Object参数的静态方法，不是我们常用的两个参数那个&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;再看看这个神秘的String.Concat(Object)&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104181317595267.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="vo{6qvpsk1f19~}y(e{vehl" border="0" alt="vo{6qvpsk1f19~}y(e{vehl" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104181317599171.jpg" width="246" height="92"&gt;&lt;/a&gt; &lt;p&gt;哦，转了一圈，还是回来了！&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="5"&gt;结果表明，&lt;font color="#ff0000"&gt;""+obj&lt;/font&gt;跟&lt;font color="#ff0000"&gt;obj==null?"":obj.ToString()&lt;/font&gt;是完全一样的！&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2019751.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/04/18/2019751.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nnhy/archive/2011/04/14/2016021.html</id><title type="text">最终版 Reflector v1.0 （+简单的反流程混淆）</title><summary type="text">Reflector过期？这可不行！自己动手吧！ 看雪上拿到Reflector 7.0的源码，根据自己需要稍作修改，自己编译，就这么简单！ 为了便于使用，自己做了一些修改： 1，移除所有授权相关代码和资...</summary><published>2011-04-14T06:44:00Z</published><updated>2011-04-14T06:44:00Z</updated><author><name>大石头</name><uri>http://www.cnblogs.com/nnhy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nnhy/archive/2011/04/14/2016021.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nnhy/archive/2011/04/14/2016021.html"/><content type="html">&lt;p&gt;&lt;font color="#ff0000" size="5"&gt;&lt;strong&gt;（0415增加简单的反流程混淆功能，满足日常使用需要，不再更新，转向ILSpy，见12点后面）&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;Reflector过期？这可不行！自己动手吧！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;看雪上拿到Reflector 7.0的源码，根据自己需要稍作修改，自己编译，就这么简单！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;为了便于使用，自己做了一些修改：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;1，移除所有授权相关代码和资源&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;2，移除所有报告错误相关代码和资源&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;3，移除ReflectorInstaller相关代码和资源，大小由4.3M（混淆压缩）变成2.8M（未混淆压缩）&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;4，增加代码着色，原来只有黑色和深绿色，看起来要命。类名红色，方法名绿色，类字段浅黄色，参数浅绿色，本地变量黑色（若不喜欢自己修改代码）&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444202735.png"&gt;&lt;font size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444205276.png" width="754" height="233"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;5，改善if语句，只有一个语句时不换行，不加大括号，增加代码可读性。下图第一行&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444206148.png"&gt;&lt;font size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444202245.png" width="477" height="162"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;6，改善表达式圆括号。原来为了严禁，几乎每一个子表达式外面都套一层圆括号，如果一个条件表达式有多个子表达式组成，最后将会看到非常多的圆括号。这里引入运算符优先级，不需要的时候不加圆括号&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444201165.png"&gt;&lt;font size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444207261.png" width="728" height="80"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;7，人工对上百个类进行反混淆，增加Reflector代码可读性，这次发布的版本也没有进行任何混淆&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;9，解除Reflector对部分产品反编译的限制，里面居然有国产的Dv_News&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;10，针对名称混淆，如果出现不可见字符，一律使用斜杠\加ASCII码的方式&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;11，解封所有隐藏功能。那个路径，是vs所在路径，选择需要的功能，然后Extract……&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444216181.png"&gt;&lt;font size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444219246.png" width="420" height="342"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444213390.png"&gt;&lt;font size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444212311.png" width="467" height="348"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444216247.png"&gt;&lt;font size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104141444218440.png" width="659" height="578"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;12，增加简单的反流程混淆功能&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245296563.png"&gt;&lt;font color="#000000" size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245308265.png" width="399" height="186"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245311711.png"&gt;&lt;font color="#000000" size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245326794.png" width="503" height="186"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;&amp;nbsp;&lt;/font&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245336054.png"&gt;&lt;font color="#000000" size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245346186.png" width="464" height="422"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245356633.png"&gt;&lt;font color="#000000" size="5"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nnhy/201104/201104152245364257.png" width="534" height="371"&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一般的流程混淆（如SmartAssembly），都是通过增加很多跳转指令，打乱IL指令的顺序，而Reflector采用的是栈式分析，遇到这种最简单的调整，直接因为栈不平衡而崩溃。我找到问题所在后，发现根本无法补救，因为Reflector可以说压根就没有AST！做了一个尝试，把多余的跳转全部干掉，结果Reflector的分析过程相当脆弱……最后，在进行指令分析之前，增加一块功能，根据强跳转给指令来一个排序，排序后，每一个强跳转，实际上就是下一句，然后再花最小的代价增强Reflector的分析功能（因为它还是脆弱得立马崩溃……）&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 写到最后，忽然间想起来，我在08年做过反名称混淆和反流程混淆的工具，基于Cecil，离开上海后不知道代码丢哪里去了。当然，我的工具还有一些非常具有特色的功能，移植到Reflector是不可能了，因为Reflector的架构真的很糟糕！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 同根生与Cecil，我很看好ILSpy！并且我发现ILSpy有很棒的AST和专门的反流程混淆！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff" size="5"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="7"&gt;&lt;strong&gt;下载地址改为：&lt;/strong&gt;&lt;/font&gt;&lt;a title="http://xcode.codeplex.com/releases/view/64499" href="http://xcode.codeplex.com/releases/view/64499"&gt;&lt;font color="#ff0000" size="7"&gt;&lt;strong&gt;http://xcode.codeplex.com/releases/view/64499&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;最后，为了辨别不同的修改版，把版本号给改了一下！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="5"&gt;最最后，Reflector的反流程混淆能力依然很差，这里推荐新生的&lt;font color="#0000ff"&gt;&lt;strong&gt;ILSpy&lt;/strong&gt;&lt;/font&gt;，它的开源和规范化，有取代Reflector的趋势！&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://files.cnblogs.com/nnhy/Reflector_20110414141718.rar"&gt;&lt;strong&gt;&lt;font color="#ff0000" size="6"&gt;修改版 Reflector v1.0.2011.0408&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://files.cnblogs.com/nnhy/Reflector_Src_20110414145823.rar"&gt;&lt;font color="#ff00ff" size="7"&gt;&lt;strong&gt;源代码（密码是：NewLife+群号码，7个字母和8个数字，别偷懒o(∩_∩)o ）&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://www.cnblogs.com/nnhy/aggbug/2016021.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nnhy/archive/2011/04/14/2016021.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
