<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_LiXiong's Debugging paper</title><subtitle type="text">《Windows用户态程序高效排错》</subtitle><id>http://feed.cnblogs.com/blog/u/20662/rss</id><updated>2011-12-25T10:04:04Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/20662/rss"/><entry><id>http://www.cnblogs.com/lixiong/archive/2011/12/25/2300803.html</id><title type="text">Web服务的性能，和BCrypt性能问题的解决方法</title><summary type="text">在昨天的研究中，发现BCrypt最大的隐患在于性能。BCrypt的安全性是通过牺牲性能来获取的。BCrypt比传统hash+salt要安全一万倍，但是代价是使用BCrypt做认证对比密码和密文时候，性能也比hash+salt要慢一万倍。 所以，我得出一个结论。如果使用传统hash+salt需要N台认证服务器的话，那用BCrypt就需要添加10000*N台服务器才能达到同样的性能。比如一个邮件系统使用了2台服务器来专门作认证，那使用BCrypt的话就需要再购买2万台。当然，小的应用，如果使用一台服务器1%的性能就可以做完认证的话，使用BCrypt只需要100台服务器。 这个听起来比较吓人...</summary><published>2011-12-24T17:51:00Z</published><updated>2011-12-24T17:51:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2011/12/25/2300803.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2011/12/25/2300803.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;在&lt;a href="http://www.cnblogs.com/lixiong/archive/2011/12/24/2300098.html"&gt;昨天的研究&lt;/a&gt;中，发现&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;最大的隐患在于性能。&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;的安全性是通过牺牲性能来获取的。&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;比传统&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;要安全一万倍，但是代价是使用&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;做认证对比密码和密文时候，性能也比&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;要慢一万倍。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;所以，我得出一个结论。如果使用传统&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;需要&lt;/span&gt;N&lt;span style="font-family:宋体;"&gt;台认证服务器的话，那用&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;就需要添加&lt;/span&gt;10000*N&lt;span style="font-family:宋体;"&gt;台服务器才能达到同样的性能。比如一个邮件系统使用了&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;台服务器来专门作认证，那使用&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;的话就需要再购买&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;万台。当然，小的应用，如果使用一台服务器&lt;/span&gt;1%&lt;span style="font-family:宋体;"&gt;的性能就可以做完认证的话，使用&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;只需要&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;台服务器。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;这个听起来比较吓人，但是我通过另外一种计算方法，也能得出同样的结果。比如说&lt;/span&gt;163&lt;span style="font-family:宋体;"&gt;的邮件系统，峰值的时候每秒钟可能需要处理&lt;/span&gt;10000&lt;span style="font-family:宋体;"&gt;个登陆请求。比如每天早上&lt;/span&gt;9&lt;span style="font-family:宋体;"&gt;点到&lt;/span&gt;9&lt;span style="font-family:宋体;"&gt;点半之间，很多人都会登陆邮件系统。按照&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;提到的，每个请求需要花费&lt;/span&gt;0.3&lt;span style="font-family:宋体;"&gt;秒，那么处理&lt;/span&gt;10000&lt;span style="font-family:宋体;"&gt;个请求需要&lt;/span&gt;3000&lt;span style="font-family:宋体;"&gt;秒。这显然是不能接受的。如果要让客户都能在&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;秒钟登陆，那就需要添加服务器，把登陆请求均分到各个服务器上。对于单&lt;/span&gt;CPU&lt;span style="font-family:宋体;"&gt;的服务器，就一共需要&lt;/span&gt;3000&lt;span style="font-family:宋体;"&gt;台。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;我把上面的想法和网友讨论后，得到了不同的意见。有人觉得&lt;/span&gt;0.3&lt;span style="font-family:宋体;"&gt;秒的处理时间其实不多阿，因为通常一个&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;请求，内存，磁盘数据库转一圈下来，离&lt;/span&gt;0.3&lt;span style="font-family:宋体;"&gt;秒也差不多了吧，所以&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;的&lt;/span&gt;0.3&lt;span style="font-family:宋体;"&gt;秒的开销是一个正常值，不会带来什么问题。有人提到普通&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器每秒处理&lt;/span&gt;1000&lt;span style="font-family:宋体;"&gt;个请求是很常见的。如果按照我上面的计算方法，这就表示每个请求在&lt;/span&gt;1ms&lt;span style="font-family:宋体;"&gt;内完成了，这听起来有点不可能嘛。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;根据上面的意见，我又仔细思考了一下。我想借这个话题，先讨论一下&lt;/span&gt;Web&lt;span style="font-family:宋体;"&gt;服务器的性能，再看看&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;带来的问题应该如何解决。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;注意，下面所叙述的，是根据我现有知识和经验做的逻辑推理。我没有写半行&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;程序的&lt;/span&gt;code&lt;span style="font-family:宋体;"&gt;来验证，我也没有任何大规模&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;项目的经验。但是我非常喜欢先做这样&amp;#8220;纸上谈兵&amp;#8221;的推理，因为这样可以让我先仔细想清楚后再行动。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;网页的加载时间，和单个&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;的处理时间是不一样的。单个网页中往往包含多个子元素，比如图片和&lt;/span&gt;AJAX&lt;span style="font-family:宋体;"&gt;调用。这些子元素的加载都会在额外的&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;里面完成。另外网页加载的时间除了&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器的运算处理时间外，还有数据在网络上的传输时间，脚本运行时间，浏览器绘制时间，当然如果是第一次访问，还包括&lt;/span&gt;DNS&lt;span style="font-family:宋体;"&gt;查询和&lt;/span&gt;TCP&lt;span style="font-family:宋体;"&gt;握手时间等等。现在主流网站的页面加载时间都在&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;秒以内，每个页面大概包含&lt;/span&gt;10-50&lt;span style="font-family:宋体;"&gt;个子元素。客户端脚本和浏览器的处理占用了大概一半时间，所以跟服务器相关的时间大概就是&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;秒。由于部分子元素可能在浏览器中有&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;，所以这&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;秒钟对应的大概就是&lt;/span&gt;5-25&lt;span style="font-family:宋体;"&gt;个请求。这样算下来每个请求大概在&lt;/span&gt;200-40&lt;span style="font-family:宋体;"&gt;毫秒之间。这里面大概&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器的运算开销可能只有&lt;/span&gt;25%&lt;span style="font-family:宋体;"&gt;，那大概就是&lt;/span&gt;50ms&lt;span style="font-family:宋体;"&gt;到&lt;/span&gt;10ms&lt;span style="font-family:宋体;"&gt;之间。注意，&lt;/span&gt;50ms-10ms&lt;span style="font-family:宋体;"&gt;这个估算是指平均时间。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;由于网络传输和客户端导致的开销不是今天的讨论范围，所以下面就只讨论&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器运算一个&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;需要怎样的开销。处理一个&lt;/span&gt;web request&lt;span style="font-family:宋体;"&gt;，通常牵涉到下面一些工作。输出流添加，数据库读写，文件读写，复杂计算。输出流添加是最常见的，比如服务器会把&lt;/span&gt;Response.Write&lt;span style="font-family:宋体;"&gt;里面的内容加入到&lt;/span&gt;Response&lt;span style="font-family:宋体;"&gt;里面。输出流添加是非常快的。速度和&lt;/span&gt;string.format&lt;span style="font-family:宋体;"&gt;或者&lt;/span&gt;StringBuilder.Append&lt;span style="font-family:宋体;"&gt;应该在一个数量级。肯定比毫秒要快多个数量级。复杂计算是指需要&lt;/span&gt;CPU&lt;span style="font-family:宋体;"&gt;密集超过&lt;/span&gt;50ms&lt;span style="font-family:宋体;"&gt;的运算，比如正则表达式运算和&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;操作。数据库读写和文件读写所需要的时间往往也超过&lt;/span&gt;50ms&lt;span style="font-family:宋体;"&gt;，但是这两者不一定需要占用&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器的&lt;/span&gt;CPU&lt;span style="font-family:宋体;"&gt;资源。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;由此，在考量&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器运算一个&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;所需的开销的时候，先看这个&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;是不是需要复杂运算。如果需要，那么这个复杂运算肯定是一个瓶颈。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;那么数据库和文件操作是不是瓶颈呢。从处理&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;所需的时间上来说，这两者肯定也是瓶颈。因为再快也得先等到这两者返回。但是和复杂运算相比，复杂运算损害的不单单是&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;所需的时间，另外还损害了服务器的可伸缩性。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;由于数据库和文件操作不占用&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器的&lt;/span&gt;CPU&lt;span style="font-family:宋体;"&gt;，所以&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器在等待数据库和文件操作结果的时候，可以把&lt;/span&gt;CPU&lt;span style="font-family:宋体;"&gt;资源用来处理新的&lt;/span&gt;request&lt;span style="font-family:宋体;"&gt;。比如来了&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;个请求，每个请求都需要&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;秒钟的数据库操作，不等于说服务器需要&lt;/span&gt;200&lt;span style="font-family:宋体;"&gt;秒才能处理完所有请求的。因为服务器可以让&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;个请求都进来，然后发送者&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;个请求的数据库操作，然后让这&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;个请求同时等待。&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;秒钟以后，这&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;个数据库操作的结果都返回回来后，服务器可以把这&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;个请求的结果都返回了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;但如果请求中牵涉到了复杂运算呢，服务器就没办法并发了。如果来了&lt;/span&gt;100&lt;span style="font-family:宋体;"&gt;个请求，每个请求都需要运算&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;秒钟，而服务器如果只有一个&lt;/span&gt;CPU&lt;span style="font-family:宋体;"&gt;的话，那就一定需要&lt;/span&gt;200&lt;span style="font-family:宋体;"&gt;秒。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;由此可见，请求的平均处理时间和服务器的吞吐量不是简单的比例关系。这牵涉到这个请求具体是如何处理的。如果服务器的吞吐量是&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;秒钟&lt;/span&gt;1000&lt;span style="font-family:宋体;"&gt;个请求，不能简单地用&lt;/span&gt;1000&lt;span style="font-family:宋体;"&gt;毫秒除以&lt;/span&gt;1000&lt;span style="font-family:宋体;"&gt;，得到每个请求只需要&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;毫秒来处理。这个运算法则只在没有任何并发可能性的情况下才有效。这也在此证明了，合理使用异步调用，对服务器性能会有多大的提高。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;接下来反过来想，对于一个不涉及数据库，不涉及文件，不涉及复杂运算的请求，合理的处理时间应该是多少呢。这个处理时间其实等同于同等复杂程度的函数调用时间。换句话说，如果只是计算出一个几十&lt;/span&gt;k&lt;span style="font-family:宋体;"&gt;的页面，花费的时间肯定在&lt;/span&gt;1ms&lt;span style="font-family:宋体;"&gt;的数量级。你肯能觉得这里没有考虑&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器的&amp;#8220;仪式性&amp;#8221;开销，比如说处理&lt;/span&gt;TCP&lt;span style="font-family:宋体;"&gt;报文，分析&lt;/span&gt;HTTP&lt;span style="font-family:宋体;"&gt;头等等。其实，主流的&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器在这方面已经足够优化，比如从&lt;/span&gt;IIS6&lt;span style="font-family:宋体;"&gt;开始，对于&lt;/span&gt;HTTP&lt;span style="font-family:宋体;"&gt;协议的处理都直接在内核里面做了，所以就算把这些开销都算上，也能做到&lt;/span&gt;1ms&lt;span style="font-family:宋体;"&gt;的数量级。对于计算机来说，&lt;/span&gt;1ms&lt;span style="font-family:宋体;"&gt;其实很长的，&lt;/span&gt;1ms&lt;span style="font-family:宋体;"&gt;表示一秒内调用函数&lt;/span&gt;1000&lt;span style="font-family:宋体;"&gt;次而已。不信你可以估算一下下面的代码，循环了&lt;/span&gt;10000&lt;span style="font-family:宋体;"&gt;次，大概需要多少时间：&lt;/span&gt;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;"&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="590" valign="top" style="width:6.15in;border:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;   color:#2B91AF"&gt;StringBuilder&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:   NSimSun;"&gt; dummy = &lt;span style="color:blue"&gt;new&lt;/span&gt;   &lt;span style="color:#2B91AF"&gt;StringBuilder&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;   color:blue"&gt;for&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;"&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; i = 0; i   &amp;lt; 10000; i++)&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;"&gt;{&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dummy.AppendLine((&lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#A31515"&gt;"this   is {0}"&lt;/span&gt;, i)));&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;"&gt;}&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;   color:blue"&gt;var&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:NSimSun;"&gt; len = dummy.Length;&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;另外，上诉的讨论还没有考虑一个非常重要的武器&lt;/span&gt;:Cache&lt;span style="font-family:宋体;"&gt;。如果使用&lt;/span&gt;cache, &lt;span style="font-family:宋体;"&gt;整个页面可能根本不需要任何运算，都不需要跑一行处理代码，&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;服务器就把结果给返回了。如果大量使用&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;，别说一千次，一秒钟处理上十万次都可以。大多数的网站已经广泛使用&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;了，图片是&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;的，&lt;/span&gt;blog&lt;span style="font-family:宋体;"&gt;文章的内容是&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;的，甚至评论都是&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;的。正因为如此，把包含复杂运算，数据库和文件处理的慢操作跟带&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;的块操作一平均，结果落到前面估算的&lt;/span&gt;50ms-10ms&lt;span style="font-family:宋体;"&gt;是很自然的事情。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;有了上面的分析后，再来看文章前面的两个问题。第一个问题是，&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;的&lt;/span&gt;300ms&lt;span style="font-family:宋体;"&gt;开销，和数据库，磁盘文件兜一圈下来的开销也差不多阿，为什么说&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;就更严重呢。原因是&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;的&lt;/span&gt;300ms&lt;span style="font-family:宋体;"&gt;都压在了&lt;/span&gt;CPU&lt;span style="font-family:宋体;"&gt;上面，而人家的是可以并发的。当然，动不动就要去兜数据库和磁盘文件的&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;应用，设计上也有问题的。第二个问题是，我的服务器可以一秒钟处理&lt;/span&gt;1000&lt;span style="font-family:宋体;"&gt;个请求，按照原来的计算方法，就是&lt;/span&gt;1ms&lt;span style="font-family:宋体;"&gt;处理&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;个了，这个不可能吧。这个问题就要区分情况来回答了。首先，&lt;/span&gt;1ms&lt;span style="font-family:宋体;"&gt;处理&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;个请求是可能的，比如使用了&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;，绝对能。其次，如果考虑并发的话，的确不能简单做除法。但问题关键是，&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;是不支持并发的阿。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;所以，&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;最大的隐患的确就是在性能上。我所做的下列判断是正确的：&amp;#8220;如果使用传统&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;需要&lt;/span&gt;N&lt;span style="font-family:宋体;"&gt;台认证服务器的话，那用&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;就需要添加&lt;/span&gt;10000*N&lt;span style="font-family:宋体;"&gt;台服务器才能达到同样的性能&amp;#8221;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;接下来的问题是，&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;性能问题有解决办法么。在前面的逻辑推理中，我想到了一个最常见的办法：用空间换时间。我可以在内存中建立&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;，把密码原文和用&lt;/span&gt;BCrypt&lt;span style="font-family:宋体;"&gt;计算后的&lt;/span&gt;hash&lt;span style="font-family:宋体;"&gt;缓存起来。这样每次处理认证请求的时候，就不需要计算了。当然，这里其实带来了新的安全隐患。如果有人盗窃了服务器的内存转储&lt;/span&gt;(memory dump), &lt;span style="font-family:宋体;"&gt;那么就能看到&lt;/span&gt;cache&lt;span style="font-family:宋体;"&gt;里面的东西，那可就是密码的原文明文阿。这有何去何从呢？&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;引起这片文章的讨论来源&lt;/span&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weibo.com/1709648133/xDtMxivam"&gt;http://weibo.com/1709648133/xDtMxivam&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weibo.com/1709648133/xDy7YjYX0"&gt;http://weibo.com/1709648133/xDy7YjYX0&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lixiong/aggbug/2300803.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lixiong/archive/2011/12/25/2300803.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2011/12/24/2300098.html</id><title type="text">md5/sha1+salt和Bcrypt</title><summary type="text">今天在weibo.com上看到一则消息说, 用md5/sha1+salt的方法保存密码是不安全的. 文章中用连续9个Bcrypt加感叹号来强调, 保存密码一定要用Bcrypt. 这个消息非常应景, 因为csdn.net两天前把数据库弄丢了, 里面的密码是明文保存的. 我对密码和安全没有研究, 但是在我粗浅的记忆中, hash+salt是非常主流的方法. 如果说这样也不靠谱, 那我正好借这个机会复习一下. 我把密码安全分为两个等级, 黄色和红色. 当数据库丢失后, 能算出一个可以用来登陆的密码, 这个密码不一定是原文, 但是保证可以通过验证, 这个算达到黄色. 如果还能算出原文, 这个就达到..</summary><published>2011-12-23T20:04:00Z</published><updated>2011-12-23T20:04:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2011/12/24/2300098.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2011/12/24/2300098.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-family:宋体;"&gt;今天在&lt;/span&gt;weibo.com&lt;span style="font-family:宋体;"&gt;上看到一则消息说&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;用&lt;/span&gt;md5/sha1+salt&lt;span style="font-family:宋体;"&gt;的方法保存密码是不安全的&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;文章中用连续&lt;/span&gt;9&lt;span style="font-family:宋体;"&gt;个&lt;/span&gt;&lt;a name="OLE_LINK2" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cnblogs.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "&gt;&lt;/a&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;加感叹号来强调&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;保存密码一定要用&lt;/span&gt;Bcrypt.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;这个消息非常应景&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;因为&lt;/span&gt;csdn.net&lt;span style="font-family:宋体;"&gt;两天前把数据库弄丢了&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;里面的密码是明文保存的&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;我对密码和安全没有研究&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;但是在我粗浅的记忆中&lt;/span&gt;, hash+salt&lt;span style="font-family:宋体;"&gt;是非常主流的方法&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;如果说这样也不靠谱&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;那我正好借这个机会复习一下&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;我把密码安全分为两个等级&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;黄色和红色&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;当数据库丢失后&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;能算出一个可以用来登陆的密码&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;这个密码不一定是原文&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;但是保证可以通过验证&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;这个算达到黄色&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;如果还能算出原文&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;这个就达到了红色&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;红色比黄色严重得多&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;因为用户往往在多个网站上都使用了同样的密码&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;如果攻击者拿到原文&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;这等于说多个网站都受到影响了&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;如果拿不到原文&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;那攻击者最多也就破坏当前这个泄露数据库的网站&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;不会影响到其它网站&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;在我看来&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;很多用户对安全的要求是&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;如果我使用的网站&lt;/span&gt;A&lt;span style="font-family:宋体;"&gt;不幸阵亡了&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;只要密码原文不泄漏&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;就不会伤及我使用同样密码注册的其它网站&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;至于在网站&lt;/span&gt;A&lt;span style="font-family:宋体;"&gt;上面的任何损失&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;我都不在乎了&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;在这个背景下&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;我的本能看法是&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;用&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;难道不能实现上述的要求&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;一定要使用&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;吗&lt;/span&gt;?&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果仔细分析一下黄色和红色的定义&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;会发现一个问题&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;对于一个给定的可以用来登陆的密码&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;如何判定这个密码就是原文呢&lt;/span&gt;? &lt;span style="font-family:宋体;"&gt;这里的解决方法通常就是对比字典&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;或者观察这个密码的字面特性&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;既然牵涉到字典&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;情况就更加有趣了&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;破解密码的两种方法分别是穷举和字典&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;我从&lt;/span&gt;wikipedia&lt;span style="font-family:宋体;"&gt;以及介绍上&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;的资料上了解到&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;如果只是穷举&lt;/span&gt;, hash+48&lt;span style="font-family:宋体;"&gt;位的&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;算起来已经比较困难了&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;文章中说，半分钟可以穷举完所有的&lt;/span&gt;6&lt;span style="font-family:宋体;"&gt;位密码。可以想象，如果加上一个&lt;/span&gt;48&lt;span style="font-family:宋体;"&gt;位的&lt;/span&gt;salt, &lt;span style="font-family:宋体;"&gt;按照复杂度的增加比例，要穷举完所有可能的密码，至少还是要按月算计算的吧。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;在这样的情况下，如果要想得到密码原文，首先需要花大量时间把很多可能的密码都算出来，然后才能挑选原文。就算用集群计算机，这个也需要几天时间吧。我想也不是所有用户都能享受到这个待遇的吧。如果这条路走不成，那就只有反过来，根据现成的字典来算。如果不幸使用了字典中能查到的就活该倒霉了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;当然，上面的假设是窃密者不知道&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;的情况&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;如果&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;一起丢了的话&lt;/span&gt;, salt&lt;span style="font-family:宋体;"&gt;对单个用户的保护就完全丢失了。这个情况下&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;的作用是让窃密者必须对每个用户都单独计算。但是即便是这样，如果密码稍微复杂一点，用&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;位数字字母组合，暴力走一遍也需要&lt;/span&gt;60&lt;span style="font-family:宋体;"&gt;的&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;次方除以&lt;/span&gt;700M&lt;span style="font-family:宋体;"&gt;，结果是&lt;/span&gt;66&lt;span style="font-family:宋体;"&gt;小时。实际时间应该比这个更长一点，因为这个时间没有考虑到长度小于&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;位的。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;为了证明我的想法，我特意花了&lt;/span&gt;20&lt;span style="font-family:宋体;"&gt;大洋，到&lt;/span&gt;&lt;a href="http://cmd5.com/"&gt;http://cmd5.com/&lt;/a&gt; &lt;span style="font-family: 宋体;"&gt;这个网站上买了&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;次破解机会。我提交了一个&lt;/span&gt;123456&lt;span style="font-family:宋体;"&gt;作为原文，&lt;/span&gt;12&lt;span style="font-family:宋体;"&gt;位&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;计算出来的密文。另外再提交了一个&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;位包含大小写数字和一个&lt;/span&gt;@&lt;span style="font-family:宋体;"&gt;字符的原文，&lt;/span&gt;12&lt;span style="font-family:宋体;"&gt;位同样&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;计算出来的密文。提交的时候把&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;一起提交的。明天我再看看他能计算出怎样的结果。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;根据上面的分析，使用&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;的话，在不同情况下有不同的结果：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;没有丢，除非你的确是机要人员，基本上安全。普通&lt;/span&gt;cracker&lt;span style="font-family:宋体;"&gt;不会花这么多精力来搞你。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;丢了，情况根据密码复杂度来看。简单密码就秒破到原文了。对于&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;位普通程度的密码，比如&lt;/span&gt;315@hkBJ&lt;span style="font-family:宋体;"&gt;这样的密码，对方可以在几个小时内走到黄色等级，但需要&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;天时间才能开始分析原文。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;再来看看使用&lt;/span&gt;&lt;a name="OLE_LINK8" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cnblogs.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "&gt;&lt;/a&gt;&lt;a name="OLE_LINK5" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cnblogs.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "&gt;&lt;/a&gt;&lt;span&gt;Bcrypt&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;的话，情况会有如何变化。&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;其实是通过增加计算密文的成本来换取安全。使用&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;，默认设置下登陆时间会增加&lt;/span&gt;5&lt;span style="font-family:宋体;"&gt;个数量级，破解成本也会增加&lt;/span&gt;5&lt;span style="font-family:宋体;"&gt;个数量级。所以使用&lt;/span&gt;&lt;a name="OLE_LINK7" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cnblogs.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "&gt;&lt;/a&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;的话，根据我的理解，情况分为两种：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;的&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;丢了，使用简单密码或者字典中存在的密码，秒破的时间从小于一分钟变到几天时间。所以使用简单密码还是不安全的。但是如果&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;没有丢，或者即便丢了但是使用了稍微复杂的密码，要达到黄色平均时间都上年了，要到红色就不可能了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;所以，总的结论是：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果使用不安全的密码，什么都帮不上忙。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果使用&lt;/span&gt;hash+salt, &lt;span style="font-family:宋体;"&gt;事故发生的时候，如果&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;丢了，算法也没有特殊的地方，只要遇上专业人员，如果密码在&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;位以内，要拿到可能的密码原文，基本上是一个星期的工作。我估计花&lt;/span&gt;1W RMB&lt;span style="font-family:宋体;"&gt;应该能找到人干。但是如果密码里面的特殊字符多一点，或者长度再长一点，基本就安全了，除非你是重要人物。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果使用&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;，那当然最好了。丢了什么都不怕。但是，使用&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;的成本是，负责做认证的服务器，可能要扩容几十倍或者几百倍哦，它是靠把计算成本提高&lt;/span&gt;5&lt;span style="font-family:宋体;"&gt;个数量级来换取安全的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;作为设计人员，使用&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;肯定安全很多。但是安全的代价是性能。小型的应用没有问题，但如果每秒峰值要做到上万次登陆呢？毕竟每次登录默认&lt;/span&gt;0.3&lt;span style="font-family:宋体;"&gt;秒的开销摆在那里，一万次是&lt;/span&gt;3000&lt;span style="font-family:宋体;"&gt;秒，如果要保证登陆在&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;秒内完成，须要&lt;/span&gt;3000&lt;span style="font-family:宋体;"&gt;个服务器啊。所以在大一点的应用上使用&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;，登陆服务器的设计和&lt;/span&gt;Bcrypt&lt;span style="font-family:宋体;"&gt;参数的配置都要仔细考量。在这样的权衡下，我觉得使用&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;仍旧是不错的选择&lt;/span&gt;. &lt;span style="font-family:宋体;"&gt;前提是要做到如下几点&lt;/span&gt;: &lt;span style="font-family:宋体;"&gt;把&lt;/span&gt;salt&lt;span style="font-family:宋体;"&gt;单独存放，&lt;/span&gt;&lt;font class="Apple-style-span" face="宋体"&gt;使用SHA512,&amp;nbsp;&lt;/font&gt;&lt;span style="font-family: 宋体; "&gt;独立设计&lt;/span&gt;hash&lt;span style="font-family: 宋体; "&gt;方法比如&lt;/span&gt;&lt;font class="Apple-style-span" face="宋体"&gt;把&lt;/font&gt;salt&lt;span style="font-family:宋体;"&gt;插到&lt;/span&gt;password&lt;span style="font-family:宋体;"&gt;中间，多做几层&lt;/span&gt;hash&lt;span style="font-family:宋体;"&gt;，另外把代码和数据库分开存放。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面这篇文章详细分析了Bcrypt的性能。得到的结论是除非你给五角大楼写程序，通常的SHA512足够好了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://www.binarylogic.com/2008/11/22/storing-nuclear-launch-codes-in-your-app-enter-bcrypt-for-authlogic/"&gt;http://www.binarylogic.com/2008/11/22/storing-nuclear-launch-codes-in-your-app-enter-bcrypt-for-authlogic/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;#8220;&lt;span class="Apple-style-span" style="color: #292929; font-family: Arial; font-size: 12px; line-height: 20px; "&gt;The level of security your app provides is really up to you. Unless you are writing apps for the pentagon, the default Sha512 is fine. Regardless, Authlogic shouldn&amp;#8217;t get in your way or make decisions for you, so if you feel BCrypt is necessary then go for it.&lt;/span&gt;&amp;#8221;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;作为用户来讲，主要是做到两点。首先要使用比较复杂的密码，其次是不同安全级别的网站要使用不同的密码。比如国内网站和国外网站坚决不用一样的。银行密码不用一样的。如果注册使用邮箱作为源，那这个源的密码要特别设计。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;以上就是今天晚上研究了&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;个小时的收获。看来我&lt;/span&gt;7&lt;span style="font-family:宋体;"&gt;年前了解到的&lt;/span&gt;hash+salt&lt;span style="font-family:宋体;"&gt;，在新时代的计算能力面前的确比较脆弱了。我算重新入门了一次。多谢&lt;/span&gt; @&lt;span style="font-family:宋体;"&gt;左耳朵耗子&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;相关资料&lt;/span&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://codahale.com/how-to-safely-store-a-password/"&gt;http://codahale.com/how-to-safely-store-a-password/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Bcrypt"&gt;http://en.wikipedia.org/wiki/Bcrypt&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Rainbow_table"&gt;http://en.wikipedia.org/wiki/Rainbow_table&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Salt_(cryptography)"&gt;http://en.wikipedia.org/wiki/Salt_(cryptography)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cmd5.com/"&gt;http://cmd5.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lixiong/aggbug/2300098.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lixiong/archive/2011/12/24/2300098.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2011/12/03/2274671.html</id><title type="text">从Win8回顾微软平台的各种技术</title><summary type="text">我安装好Win8 CTP后做的第一件事情就是用调试器研究Win8各个组件的协作关系. 从我半天的研究结果看来, Win8真是一个让我爱不释手的产品. Win8里面涉及到的很多技术正好也是我的兴趣所在. 这篇文章简单回顾一下这些技术的变迁, 优缺点, 和对Win8的影响. 注意, 下面提到的对Win8的分析, 是基于公开的Win8 CTP来做的. 相信Win8面世的时候, 这些技术和细节, 都会发生重大改变. 所以这篇文章不具备实践上的指导价值. COM -Component Object Model 通用组件模型 COM是上个世纪中期设计出来的伟大产品. COM旨在解决软件复用的问题. ...</summary><published>2011-12-03T06:15:00Z</published><updated>2011-12-03T06:15:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2011/12/03/2274671.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2011/12/03/2274671.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;我安装好&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8 CTP&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;后做的第一件事情就是用调试器研究&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;各个组件的协作关系&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;从我半天的研究结果看来&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;真是一个让我爱不释手的产品&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;里面涉及到的很多技术正好也是我的兴趣所在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这篇文章简单回顾一下这些技术的变迁&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;优缺点&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的影响&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;注意&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;下面提到的对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的分析&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是基于公开的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8 CTP&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来做的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;相信&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;面世的时候&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这些技术和细节&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都会发生重大改变&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;所以这篇文章不具备实践上的指导价值&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:18.0pt;font-family:&amp;quot;Cambria&amp;quot;,&amp;quot;serif&amp;quot;;Times New Roman&amp;quot;;color:#365F91;"&gt;COM -Component&lt;/span&gt;&lt;span style="font-size:18.0pt;font-family:&amp;quot;Cambria&amp;quot;,&amp;quot;serif&amp;quot;;Times New Roman&amp;quot;;color:#365F91;"&gt; Object Model &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:18.0pt;font-family:宋体;color:#365F91;"&gt;通用组件模型&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是上个世纪中期设计出来的伟大产品&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;旨在解决软件复用的问题&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;以前&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;大家都是用代码级别的复用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;常见的就是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C/C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的库&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;无论是原代码库还是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;lib&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;库&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都是需要编译后才能重用的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使得技术人员可以在二进制上进行复用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;从&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win95, OLE32&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Office95&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;系列开始&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就是微软平台上的一个技术基石&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;无论是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DirectX API, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;还是最常见的剪贴板&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;以及后来&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.NET Framework&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;host&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;接口&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都离不开&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但任何伟大的产品&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都有局限的一面&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在局限性在下面一些地方&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size: 12.0pt;Times New Roman&amp;quot;;color:black"&gt;STA/MTA/NTA&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;等等线程模型过于复杂&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;线程模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;特别是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;STA, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;设计的目的是方便使用者&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的线程模型严重依赖于太多系统组件&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win32 Message, RPC&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;系统服务&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使得程序员需要熟悉和了解太多系统知识才可以正确地使用线程模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;否则用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;STA&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;导致死锁简直就是家常便饭&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;开发工具没有提供足够支持&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Visual Studio 6.0&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的关系&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就如同现在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR2/VS2005, CLR3.5/VS2008&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR4/VS2010&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的关系一样铁&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;开发&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;当时的选择要么是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;VB6, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;要么用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;ATL. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这两者都有天生的局限&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. VB6&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;适合企业开发&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;特别是当时流行的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MIS&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;系统&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;数据库系统这样的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CS&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;应用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;VB6&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;不够灵活&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;而且&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;VB6&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;里面由于缺少多线程支持&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;无法用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MTA&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. ATL&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;功能强大&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;足够灵活&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但是使用起来特别复杂&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;每次实现一个接口&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都要做一大堆&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的仪式性工作&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如实现多重继承&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;定义新的模板&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使用大量的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;宏&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;神经再粗大的程序员&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都经不起这样用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;无止境地扩充到&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DCOM, COM+, DTC, MSMQ&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:12.0pt; font-family:宋体;Times New Roman&amp;quot;;color:black"&gt;以及后来的&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;; color:black"&gt;.NET Remoting/WCF, &lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使得最后的复杂度无法控制&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;为了更好地适应企业级别的开发&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;被进一步延伸和演化成了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DCOM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM+. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;所谓&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;"&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;企业级别&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;", &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;其实是指对安全性和可伸缩性的更高要求&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;经典的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是一个进程内模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;无法让不同的代码运行在不同的帐号下的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;因为同一个进程只能启在唯一的帐号下&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;虽然通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;impersonate&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;等方法可以适当地解决问题&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但是为了让安全模型更为全面&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;正确的做法是让不同的接口实现&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;能够跨越进程甚至跨越机器等安全边界运行&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;要能够赋予不同的接口不同的安全级别&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;能够和域帐号集成&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;支持不同等级的加密等等&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;远程通用组件模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也就是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DCOM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就这样诞生了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;读者可以尝试运行以下&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;dcomcnfg.exe&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这个工具&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;展开一些节点&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;看看属性页&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就能体会到&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DCOM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的功能是多么让人眼花缭乱了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;对于可伸缩性&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;微软更上一层楼&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DCOM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的基础上加入了对象池和新的同步模型做成了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM+. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;风靡十年的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;ASP, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就是运行在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM+&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;框架下的最好例子&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;更让人叹为观止的是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;微软把&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DTC&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MSMQ&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的设计也和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM+&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;模型绑定起来&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;陌生的读者可能不了解&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DTC&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是个多么&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;nb&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的东西&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;简单说&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DTC&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是可以让程序员一行代码都不用写&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就让&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;SQL Server&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Oracle&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的数据库操作运行在同一个事务边界里面&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;可以想象&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MSSQL Server&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;刚进入市场的时候&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;微软推出这样的功能&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;对于抢占&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Oracle&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的市场份额有多么重要&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. DTC&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM+&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;当时成为了很多大公司的标准配置&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;以至于后来设计&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.NET Remoting&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WCF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的时候&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都还是要考虑对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DTC&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的支持&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这些强大而且复杂的功能&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;让本来就复杂的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;更加恐怖&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这样的复杂度虽然也体现了当时的市场需求&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但由于缺乏配套的开发工具&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;新的开发语言和更优美的抽象&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使得这条路最后越走越窄&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-size:18.0pt;font-family:&amp;quot;Cambria&amp;quot;,&amp;quot;serif&amp;quot;;Times New Roman&amp;quot;;color:#365F91;"&gt;.NET Framework/CLR&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在我眼中&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的各方面简直是无可挑剔的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但可能正是因为&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;太好了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;让微软从&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;2003&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;年开始&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmamanged world&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的投资就不大了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;为了争取企业客户&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;全力推广&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是最正确的做法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;毕竟绝大多数的程序员&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;一辈子都是和数据库&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;UI&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;代码打交道&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;你总不能让他们一辈子都用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;去管理内容&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;创建窗口句柄吧&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的性能也很有竞争力&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;与之对应的编程语言和开发工具也非常给力&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;每个新版本都带来长足进步&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这些再好&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也无法掩饰一个悖论&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;: &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;要用用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;写出性能可以和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;一个数量级的程序&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;不是不可能&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;而是花费的代价往往比直接用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;写更大&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这里面有很多原因&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如系统最底层的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;API&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;还是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmanaged&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;作&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;interop&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的性能损失无法忽略&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的话程序员的控制力很弱&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;从工具和语言层面上很难对性能精雕细作&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;一不注意就&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;box/unbox&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;JIT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;编译器为了实现自己的安全模型和异常处理&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;每次访问成员函数的都是都要生成代码确认&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;this&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;指针是否为空&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这个世界上还是有很多程序&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是需要对性能做严格控制的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;高速发展的几年中&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;对应的系统平台&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, Win32 API, C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;开发工具&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;只有完善性的改善&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;并没有重大突破&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这个问题对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;平台本身影响不大&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但如果寄希望于在移动设备上&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;大家都指着&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来开发&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就有点天方夜谭了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这样的失衡&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使得微软在移动设备和消费者产品这两个严重需要&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmanaged&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和系统投入的领域缓慢发展了很长时间&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-size:18.0pt;font-family:&amp;quot;Cambria&amp;quot;,&amp;quot;serif&amp;quot;;Times New Roman&amp;quot;;color:#365F91;"&gt;WPF&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在我看来&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是一个设计得很美的产品&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;解决了传统&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win32 UI&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;程序的四大局限&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. 1) Win32&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的绘图是由各自&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Window&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;元素独立控制&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;基于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;GDI&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;引入了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;rendering thread&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来提高性能&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;优化算法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;借用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;GPU&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;加速&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. 2) Win32&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;依赖于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;GDI Object, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在开发复杂窗口程序的时候&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;很容易就遭遇资源泄露和资源不足&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如早期的淘宝旺旺&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;开到几十个窗口的时候&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;程序就会出问题&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;所以淘宝针对这个问题&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使用了统一控制台&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;合并多个窗口到标签页的方法来解决&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;而&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;只有最外面的窗口使用了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win32 Window&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;GDI, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;内部的元素都是抽象成了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;自己的元素&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;不额外占用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win32 GDI&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;资源的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. 3) Win32&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;窗体程序严重依赖&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows Message&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这要求程序员对系统知识有深入的了解&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;而且&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win32 API&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;并不是非常利于使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如要进行&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;UI thread&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Worker thread&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;之间的通信&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;往往需要和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;SendMessage&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这样的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;API&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;打交道&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;引入了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Dispatcher&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;类和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;BeginInvoke&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;方法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;把这些复杂问题抽象了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;加上&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;提供了更方便高效的开发环境&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是很愉快的工作&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. 4) Win32&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;缺乏数据&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;设计和代码三者之间的模式抽象&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这三者在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中对应了数据绑定&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, XAML&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;文件&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;以及后台代码&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中可以更直观地使用各种模式比如&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MVC&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MVVM. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这些都体现了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;设计上的优美&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;再优美的东西都还是有局限性的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的问题在于过多的模式和对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;过度的依赖&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;了解&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;框架的人都知道&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就一个简单的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;dependent property, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就把设计模式这本书里面的模式用掉一大半了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;分析&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;框架代码的话&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;简直就是看一本设计模式的百科全书&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;我曾经统计过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;关于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;mouse click&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这样一个&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;event&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;回调&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;里面有&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;7&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;种不同的实现方法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;分别各有好处&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;旨在解决不同问题&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在这样高度灵活的背后&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;牺牲的是程序性能&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;无论是五花八门的模式&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;还是最常用的数据绑定&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;背后的主力都是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;reflection. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;过度依赖于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;reflection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;导致&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;程序规模一大&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;性能上就出问题&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就算再怎么优化&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也总找不到原生&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win32&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;程序那般流利的感脚&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;reflection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也体现了对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的依赖&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;所以前面&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的局限性&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也适用于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF. &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-size:18.0pt;font-family:宋体;color:#365F91;"&gt;微软产品的互操作性&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;微软的产品线虽又长又多&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但是各个产品之间一定是能够互操作的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;可以和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;互相调用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;任何语言开发的程序都可以嵌入&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Browser Control&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来借用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;IE&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的功能&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. Office&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;暴露了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;VBA&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;接口&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;VBScript&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都能够自动化&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Office&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;程序&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;各种管理工具无论是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Explorer&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;还是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MMC, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都暴露了编程接口可以让程序员添加自己的功能&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;我见过客户用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;ASP.NET&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在后台用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;VBScript&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;生成&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Excel&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;表格&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;然后把表格嵌入在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt; IE&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;浏览器中&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;再使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;JavaScript&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来帮助客户编辑&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;最后提交回&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;MSSQL&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;数据库做完成报销功能的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;完善的互操作性充分保护了用户的投资&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使得客户对微软平台用一次就上瘾&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;几乎没有不可能完成的任务&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;仔细分析&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;其实这些互操作有一个共性&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都是把暴露&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;接口作为内部实现原理&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这个做法导致了三个局限性&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;首先是牵涉到了前面提到的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的复杂度&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;其次是潜在的性能损耗&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;最后是在具体开发的时候&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;都需要一些仪式性的工作来引入或者定义&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;接口&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使得开发过程不够自然流畅&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;互操作的调用栈里面&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;RCW, CCW, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;安全处理&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;列集拷贝等等&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;耗费的时间带来的性能开销简直是可以到了肉眼可察觉的地步&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;(&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;听硬盘的声音和看任务管理器里面&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CPU&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的波动&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;).&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-size:18.0pt;font-family:&amp;quot;Cambria&amp;quot;,&amp;quot;serif&amp;quot;;Times New Roman&amp;quot;;color:#365F91;"&gt;Win8&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在讨论完这些技术背后的故事后&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;再看看为啥我就对&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;爱不释手了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;引入了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows Runtime, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;简称&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT. WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是一个操作系统模块&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;运行在用户态&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;介于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win32&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的上层和应用程序的下层&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;目的在于提供更高效友好的开发接口供&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的程序员使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在二进制模型上基本就是照搬了经典的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM. WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;互不依赖&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;可以被&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C/C++&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;实现&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;效率高是一个方面&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;更重要的时&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;引入了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;projection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的概念&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就是可以把&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;API&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;用最直接最高效的方法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;提供给上层的编程语言调用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这个语言可以是&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#, C&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;或者&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;JavaScript.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;对于第一次接触&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Projection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的朋友&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;可以把&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Projection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;认为是一种新的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows API&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;传统的操作系统&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;API, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;要么是暴露&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;DLL&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的方法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;要么是通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;接口&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;无论是哪一种&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中调用的时候都有不小的开销&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;使用这些传统&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;API&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的效率&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比调用一个&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;自己的方法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;效率差了多个数量级&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;根本的原因在于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的安全模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;内存模型和传统的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmanaged&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;模型不兼容&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;所以跨越边界的调用需要额外的代码来处理&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;而&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Projection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;提供的模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是在提供新功能的同时&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;还针不同编程模型和语言&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;提供了最利于它们调用的方法&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这样就主动避免了不同模型之间为了互相兼容导致的开销&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也使得程序员写代码的时候非常自然流畅&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;调用的时候根本感觉不到和调用本地函数的区别&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;当然&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;能够实现这一点&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也是得益于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR, C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;语言和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;VS&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;开发工具这十年的长足发展&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;举个例子&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, C# 5.0&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中引入了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;await&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;关键字&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中引入了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;async operation. Projection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;技术把&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;await&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;语句转换为&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT async operation&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的调用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;而且这个调用直接从&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;managed code&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;直接跳到&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmanaged code, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中间没有任何冗余&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也不需要&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR Engine&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的介入&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;进一步的信息&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;可以参考&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Build&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;大会关于&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的多个演讲&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;后面的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;callstack&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;也提供了直观的例子&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;前面提到了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的局限性在于一个轻量的二进制模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;被硬生生的扩展成一个无所不能的框架&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;取其精华&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;去其糟粕&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;借用了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;COM&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的轻便&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;舍弃了复杂性&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;在扩展性上依托于上层的编程语言和工具&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;projection&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的技术解决了传统互操作性效率不高使用不方便的问题&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;以前的路线是希望所有的产品和技术最后都统一到&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;上来&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;现在修正为底层模型通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来实现&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;然后把这一层高效的组件无缝提供给上层的开发技术比如&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这个转变重新重视&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmanaged&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;层面的二进制模型&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;归纳为&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, unmanaged&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;模型的优势在于执行效率高&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;可以通吃所有场景&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;缺点在于开发和使用成本也高&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的优势在于开发成本低&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;缺点在于无法通吃各种需求&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;现在微软自己用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmanaged&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来做&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;然后把&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;提供给上层语言&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;这两者就可以取长补短了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;有了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;有了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;unmanaged&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的回归&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;再加上微软开发工具和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C#&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;语言的长足发展&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;前面介绍的各种技术在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;里面就相得益彰了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. Metro&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;是如何修复&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的缺陷就显而易见了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;: Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;metro&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;程序继续使用&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WPF&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;中引入的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;rendering&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;模型和&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;XAML, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;但是在&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;control&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的基础设计和实现上&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;从&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;CLR&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;转移到了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;C, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;然后通过&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;WinRT&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;来暴露给使用者&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;至于使用的灵活性&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;比如要不要实现数据绑定&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;就看上层使用者自己的选择了&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-size:18.0pt;font-family:宋体;color:#365F91;"&gt;附录&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;下面是我研究过程中看到的一些&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;Win8&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;的&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;callstack. &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;基于这些&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;callstack&lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;和我以往的经验&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;, &lt;/span&gt;&lt;span style="font-size:12.0pt;font-family:宋体;Times New Roman&amp;quot;; color:black"&gt;才写了上面的文章&lt;/span&gt;&lt;span style="font-size:12.0pt;Times New Roman&amp;quot;;color:black"&gt;.&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt; font-family:宋体;Times New Roman&amp;quot;;color:black"&gt;Stack1:&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!`Windows::Internal::CMessageDialog::ShowAsync'::`50'::&amp;lt;lambda_32D66FEFF293CE6B&amp;gt;::&amp;lt;lambda_32D66FEFF293CE6B&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CMessageDialog::ShowAsync+0x1a0 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;image08ee0000!DomainNeutralILStubClass.IL_STUB_CLRtoCOM()+0x8c&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;application1!Application1.MainPage+&amp;lt;button_Click&amp;gt;d__0.MoveNext()+0xcd &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;application1!Application1.MainPage.button_Click(System.Object, Windows.UI.Xaml.RoutedEventArgs)+0x80&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt; font-family:宋体;Times New Roman&amp;quot;;color:black"&gt;stack2:&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;combase!CComActivator::DoCreateInstance+0x121&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;combase!CoCreateInstanceEx+0x51&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;combase!CoCreateInstance+0x65&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CPopupWindowImpl::_TryToUnregisterForIHMNotifications+0x3b &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CPopupWindowImpl::_HideWindow+0x31&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CPopupWindowImpl::HideWindow+0x9&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CPopupWindowImpl::DestroyWindow+0x24 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CPopupWindow::Destroy+0x57&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CClosePopupCommandHandler::Invoke+0xe 0x73 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CPopupWindowImpl::_OnButtonPress+0xc0&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::CPopupWindowImpl::OnMessage+0x18b &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;DUI70!DirectUI::NativeHWNDHost::WndProc+0x73 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!InternalCallWinProc+0x23&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!UserCallWinProcCheckWow+0x100 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!DispatchMessageWorker+0x3d4&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!DispatchMessageW+0x10&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!SHProcessMessagesUntilEventsEx+0xe2&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Immersive!Windows::Internal::PopupWindowOperation::Show+0x103 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:12.0pt; font-family:宋体;Times New Roman&amp;quot;;color:black"&gt;Stack3:&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!HWWalk::RenderChildren+0x7a&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!HWWalk::RenderContentAndChildren+0x2d1&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!HWWalk::Render+0x61e&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!HWWalk::RenderChildren+0x7a&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!HWWalk::RenderRoot+0x1c4&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CCoreServices::NWDrawTree+0x698&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CCoreServices::NWDraw+0x1d6&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CRenderTarget::Draw+0x13&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CWindowRenderTarget::Draw+0x40&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CXcpBrowserHost::OnTick+0x88&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CXcpDispatcher::Tick+0x184&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CXcpDispatcher::OnReentrancyProtectedWindowMessage+0x133&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CXcpDispatcher::ProcessMessage+0xa4&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CXcpDispatcher::WindowProc+0x69&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!InternalCallWinProc+0x23&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!UserCallWinProcCheckWow+0x100&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!DispatchMessageWorker+0x3d4&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;USER32!DispatchMessageW+0x10&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;windows_ui!Windows::UI::Core::CDispatcher::ProcessMessage+0xc7 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;windows_ui!Windows::UI::Core::CDispatcher::ProcessEvents+0x6c&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CJupiterWindow::RunCoreWindowMessageLoop+0x3b&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CJupiterControl::RunMessageLoop+0x1d &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!CJupiterControlLight::RunMessageLoop+0x8&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!DirectUI::DXamlCore::RunMessageLoop+0x15 &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;Windows_UI_Xaml!DirectUI::ViewProvider::Run+0x11&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;;color:black"&gt;twinapi!Windows::ApplicationModel::Core::CoreApplicationView::ViewProviderThreadProc+0x27&lt;/span&gt;&lt;/p&gt;  &lt;p align="right" style="text-align:right;line-height:normal"&gt;&lt;em&gt;&lt;span style="font-size:9.0pt;Times New Roman&amp;quot;; color:black"&gt;This is the end&lt;/span&gt;&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lixiong/aggbug/2274671.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lixiong/archive/2011/12/03/2274671.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2010/07/13/1776284.html</id><title type="text">为什么EXE不能超过4GB</title><summary type="text">为什么EXE不能超过4GB前几天看到大家在讨论EXE装载的问题，很新奇。有的说PE装载受到进程空间的限制，有的说PE一定是整体装入，有的用ZIP自解压包来举例子。我当时大概想了一下，觉得PE不一定是要整体装入的。PE文件包含一个PE header，里面定义了各个段，比如代码，资源等等的偏移地址，装载的时候应该不会超出这个PE header的定义。也就是说，如果PE header里面定义了最远的段是...</summary><published>2010-07-13T02:32:00Z</published><updated>2010-07-13T02:32:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2010/07/13/1776284.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2010/07/13/1776284.html"/><content type="html">&lt;p&gt;为什么EXE不能超过4GB&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;前几天看到大家在讨论EXE装载的问题，很新奇。有的说PE装载受到进程空间的限制，有的说PE一定是整体装入，有的用ZIP自解压包来举例子。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我当时大概想了一下，觉得PE不一定是要整体装入的。PE文件包含一个PE header，里面定义了各个段，比如代码，资源等等的偏移地址，装载的时候应该不会超出这个PE header的定义。也就是说，如果PE header里面定义了最远的段是10M，但是PE文件有100M的话，应该最多只有10M装载。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;于是我写了一个程序来测试下。首先写一个简单的C++的helloworld。然后随便在硬盘上找了个700M左右的A片，然后执行下面的命令把这两个文件拼合起来成为一个新的EXE:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #999999"&gt;&lt;strong&gt;copy /B helloworld.exe /B + 常盘みちる.avi /B largepe.exe /B&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;然后运行这个largepe.exe, 一切正常。在debugger中加载这个largepe.exe后发现，这个module占据的内存空间和helloworld一样，并没有包avi那部分。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;所以我在想，既然是这样的话，我可以把很大的数据放到exe文件后面，然后在exe的实现里面来分段读取这些数据，实现自我播放自我解压之类的。为了再次证明这一点，我用dxshow写了一个简单的播放程序，然后用同样的办法拼接了一个4G多的高清版本。运行，发现：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;不能运行。说这个是invalid win32 application。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;好吧，由此看来，自解压文件不超过4G的确还是有原因的。但是原因到底是什么呢，难道真的和4GB内存空间相关么？于是我换了个64位的机器，运行，发现：&lt;/p&gt;&lt;p&gt;不能运行。说这个是invalid win32 application。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;哦，原来64位的机器也不能运行超过4GB的EXE啊，那看来和什么进程内存空间没太大关系了吧。但是原因到底是什么呢，我拿debugger跟到失败前的最后一个API，发现是ZwCreateSection，这个API调用失败并且返回STATUS_INVALID_FILE_FOR_SECTION。额，这里已经超出我的知识范围了，于是就去讨论组问专家，专家&lt;strong&gt;Pavel&lt;/strong&gt;说:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #999999"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #999999"&gt;SECTION_IMAGE_INFORMATION structure contains a ULONG ImageFileSize field. If we allow files larger than 4 GB, programs that use this structure may break, and that can potentially affect 3rd party apps because all this information is on the web, even though the structure and the APIs using it are not officially documented.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #999999"&gt;(Note that this is separate from the image size in the PE headers, which is also a ULONG and is currently limited to slightly less than 2 GB.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #999999"&gt;--by Pavel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #999999"&gt;"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;原来是这样啊~~~&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;PS, 附上文SECTION_IMAGE_INFORMATION的结构定义:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;a href="http://www.nirsoft.net/kernel_struct/vista/SECTION_IMAGE_INFORMATION.html" target="_blank"&gt;http://www.nirsoft.net/kernel_struct/vista/SECTION_IMAGE_INFORMATION.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #999999"&gt;typedef struct _SECTION_IMAGE_INFORMATION&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PVOID TransferAddress;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG ZeroBits;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG MaximumStackSize;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG CommittedStackSize;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG SubSystemType;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; union&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WORD SubSystemMinorVersion;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WORD SubSystemMajorVersion;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG SubSystemVersion;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG GpValue;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WORD ImageCharacteristics;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WORD DllCharacteristics;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WORD Machine;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UCHAR ImageContainsCode;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UCHAR ImageFlags;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG ComPlusNativeReady: 1;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG ComPlusILOnly: 1;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG ImageDynamicallyRelocated: 1;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG Reserved: 5;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG LoaderFlags;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG ImageFileSize;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG CheckSum;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999"&gt;} SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lixiong/aggbug/1776284.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lixiong/archive/2010/07/13/1776284.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2010/07/08/1773250.html</id><title type="text">其实.NET的确慢, 微软推的这一套的确不适合很多地方</title><summary type="text">微软的bing/msn等web平台系统都不是用c#的, 自己好像用c/c++重新搞了一套C#的速度也的确不能和C++什么的比好像对C#和CLR的性能提升在很久以前还讨论过, 后来放了一个beta版本的compiler SDK出来, 就不是重点方向了现在的重点方向是Azure不过我觉得这没什么值得义愤填膺的, 类似的话题以前VB5/C++5.0的时候就有了, 或许还能找到当时的VB5/VC5/BC/...</summary><published>2010-07-07T16:25:00Z</published><updated>2010-07-07T16:25:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2010/07/08/1773250.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2010/07/08/1773250.html"/><content type="html">&lt;p&gt;微软的bing/msn等web平台系统都不是用c#的, 自己好像用c/c++重新搞了一套&lt;/p&gt;&lt;p&gt;C#的速度也的确不能和C++什么的比&lt;/p&gt;&lt;p&gt;好像对C#和CLR的性能提升在很久以前还讨论过, 后来放了一个beta版本的compiler SDK出来, 就不是重点方向了&lt;/p&gt;&lt;p&gt;现在的重点方向是Azure&lt;/p&gt;&lt;p&gt;不过我觉得这没什么值得义愤填膺的, 类似的话题以前VB5/C++5.0的时候就有了, 或许还能找到当时的VB5/VC5/BC/Delphi大论战呢, 我这次就不跳出来哗众取宠了&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lixiong/aggbug/1773250.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lixiong/archive/2010/07/08/1773250.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2010/05/20/1740335.html</id><title type="text">微软平台UI自动化(UIA)经验集</title><summary type="text">根据我UIA自动化测试的经验, 总结了下面代码集. 在这个代码集中, 包含了:1. 一个WPF的窗体程序2. 一个WinForm的窗体, 这个窗体作为Model Dialog被WPF主程序打开3. 针对这个WPF和WinForm的测试代码例子4. 针对Win7 Calc.exe的测试代码例子5. 一个简单的TestEngine这个代码集的作用是:1. 演示UIA中基本的概念, 比如Automati...</summary><published>2010-05-20T12:30:00Z</published><updated>2010-05-20T12:30:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2010/05/20/1740335.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2010/05/20/1740335.html"/><content type="text">根据我UIA自动化测试的经验, 总结了下面代码集. 在这个代码集中, 包含了:1. 一个WPF的窗体程序2. 一个WinForm的窗体, 这个窗体作为Model Dialog被WPF主程序打开3. 针对这个WPF和WinForm的测试代码例子4. 针对Win7 Calc.exe的测试代码例子5. 一个简单的TestEngine这个代码集的作用是:1. 演示UIA中基本的概念, 比如Automati...</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2010/04/10/1709242.html</id><title type="text">今天在InfoQ看到一个google关于test的演讲, 非常精彩</title><summary type="text">今天在InfoQ看到一个google关于test的演讲, 非常精彩http://www.infoq.com/cn/presentations/duannian-agile-test演讲人段念, 似乎也叫做关河, 网上的介绍在:http://www.qconbeijing.com/Speaker.aspx?Id=33个人网站在http://www.cnblogs.com/guanhe/没想到国内社区...</summary><published>2010-04-10T13:54:00Z</published><updated>2010-04-10T13:54:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2010/04/10/1709242.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2010/04/10/1709242.html"/><content type="text">今天在InfoQ看到一个google关于test的演讲, 非常精彩http://www.infoq.com/cn/presentations/duannian-agile-test演讲人段念, 似乎也叫做关河, 网上的介绍在:http://www.qconbeijing.com/Speaker.aspx?Id=33个人网站在http://www.cnblogs.com/guanhe/没想到国内社区...</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2010/03/17/1687748.html</id><title type="text">来来来, 我也来发发我大二时候的作品</title><summary type="text">今天看到了:12年前的作品──《美绿中国象棋》制作过程及算法简介http://www.cnblogs.com/miloyip/archive/2010/03/16/1687647.html不仅想到了我大二时候的作品, 让大家比较下墙内墙外的差距, 希望大家不要见笑, 再怎么样, 我这个好歹还是开源的.第一个也是棋类游戏, 五子棋. 当时qq上都还没有五子棋, 个别网站上的支...</summary><published>2010-03-16T16:14:00Z</published><updated>2010-03-16T16:14:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2010/03/17/1687748.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2010/03/17/1687748.html"/><content type="text">今天看到了:12年前的作品──《美绿中国象棋》制作过程及算法简介http://www.cnblogs.com/miloyip/archive/2010/03/16/1687647.html不仅想到了我大二时候的作品, 让大家比较下墙内墙外的差距, 希望大家不要见笑, 再怎么样, 我这个好歹还是开源的.第一个也是棋类游戏, 五子棋. 当时qq上都还没有五子棋, 个别网站上的支...</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2010/02/11/1667516.html</id><title type="text">Windows用户态程序高效排错 全文PDF</title><summary type="text">今天一个朋友提醒我，说 Windows用户态程序高效排错 的全文应该可以免费放出来了。 我掐指一算， 早过了和出版社约定的时间。下面是Windows用户态程序高效排错 全文 PDF 的链接/Files/lixiong/userdbg_msinternal.pdf注意:1. 这个就是原书一样的内容。我太不负责了，里面的一些错误也没有修改。勘误请参考:http://blog.csdn.net/epar...</summary><published>2010-02-11T06:29:00Z</published><updated>2010-02-11T06:29:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2010/02/11/1667516.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2010/02/11/1667516.html"/><content type="text">今天一个朋友提醒我，说 Windows用户态程序高效排错 的全文应该可以免费放出来了。 我掐指一算， 早过了和出版社约定的时间。下面是Windows用户态程序高效排错 全文 PDF 的链接/Files/lixiong/userdbg_msinternal.pdf注意:1. 这个就是原书一样的内容。我太不负责了，里面的一些错误也没有修改。勘误请参考:http://blog.csdn.net/epar...</content></entry><entry><id>http://www.cnblogs.com/lixiong/archive/2009/05/25/1488569.html</id><title type="text">回顾下COM+提供的服务,就明白啥是中间层了, 我把绝招贡献给你们吧</title><summary type="text">我实在看不下去了很久很久以前,我跟大家一样,觉得三层很神秘的直到有一天,我崇拜的老大,dr0,给我说了三层的秘密后, 我觉得任督二脉立刻打通三层其实说的就是中间层.前后都不用看中间层其实看com+就可以了关键在于实现 可伸缩性 和 服务性</summary><published>2009-05-24T17:29:00Z</published><updated>2009-05-24T17:29:00Z</updated><author><name>lixiong</name><uri>http://www.cnblogs.com/lixiong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lixiong/archive/2009/05/25/1488569.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lixiong/archive/2009/05/25/1488569.html"/><content type="text">我实在看不下去了很久很久以前,我跟大家一样,觉得三层很神秘的直到有一天,我崇拜的老大,dr0,给我说了三层的秘密后, 我觉得任督二脉立刻打通三层其实说的就是中间层.前后都不用看中间层其实看com+就可以了关键在于实现 可伸缩性 和 服务性</content></entry></feed>
