﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-gjcn</title><link>http://www.cnblogs.com/gjcn/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 21 Aug 2008 08:45:09 GMT</lastBuildDate><pubDate>Thu, 21 Aug 2008 08:45:09 GMT</pubDate><ttl>60</ttl><item><title>CLR系列：大型对象堆</title><link>http://www.cnblogs.com/gjcn/archive/2008/07/23/1248587.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Wed, 23 Jul 2008 01:46:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/07/23/1248587.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1248587.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/07/23/1248587.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1248587.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1248587.html</trackback:ping><description><![CDATA[<p>园子里有很多人已经对CLR的GC Heap有过激烈的讨论，里面有不少精华文章。但是既然是CLR系列，那么就不得不对GC Heap进行讲解。本文主要是对LOH<span style="font-family: 宋体">（</span>Large Object Heap<span style="font-family: 宋体">）讲解。</span><span style="font-family: 宋体"><span style="font-family: 宋体">在一个托管进程被创建以后，在托管进程的内存空间里面，包含了</span>System Domain<span style="font-family: 宋体">，</span>Shared Domain<span style="font-family: 宋体">，</span>Default Domain<span style="font-family: 宋体">，</span>Process<span style="font-family: 宋体">的</span>Heap<span style="font-family: 宋体">，</span>JIT Code heap（都包含在<font face="Verdana">LoaderHeap）</font><span style="font-family: 宋体">，</span>GC Heap<span style="font-family: 宋体">以及</span>LOH<span style="font-family: 宋体">。</span></span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">CLR 垃圾回收器 (GC) 将对象分为大型、小型两类。如果是大型对象，与其相关的一些属性将比对象较小时显得更为重要。例如，压缩大型对象（将内存复制到堆上的其他位置）的费用相当高。我将讨论符合什么条件的对象才能称之为大型对象，如何回收这些大型对象，以及大型对象具备哪些性能意义。</span></span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><strong>大型对象堆</strong></span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">.NET Framework 1.1 和 2.0 中，如果对象大于或等于 85,000 字节，将被视为大型对象。注意：<strong>此数字根据性能优化的结果确定</strong>。当对象分配请求传入后，如果符合该大小，便会将此对象分配给大型对象堆。为什么会这样呢？我们先看看NET 垃圾回收器的基础知识。</span></span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">我们知道，.NET 垃圾回收器是分代回收器。它包含三代：第0代、第1代和第2代。之所以分代，是因为在良好调优的应用程序中，您可以在第0代清除大部分对象。每当触发一次垃圾回收，NET就首先扫描第0代，仍存在的对象将被放到第1代，当第1代放满后，会对第1代进行垃圾回收，仍存在的对象将被放到第2代，以此进行下去。但是，最后一代回收未处理的对象仍会被视为最后一代中的对象。从本质上讲，第1代是新对象区域与生存期较长的对象区域之间的缓冲区。回收任何一代，都会回收他以前的所有代。例如，执行第1代垃圾回收时，将同时回收第1代和第0代。执行第2代垃圾回收时，将回收整个堆。</span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">加载 CLR 时，将分配两个初始堆栈段（一个用于小型对象，另一个用于大型对象），我将它们分别称为小型对象堆 (SOH) 和大型对象堆 (LOH)。然后，通过将托管对象置于任一托管堆栈段上来满足分配请求。如果对象小于 85,000 字节，则将其放在 SOH 段上；否则将其放在 LOH 段上。随着分配到各段上的对象越来越多，会以较小块的形式提交这些段。用户代码只能在第 0 代（小型对象）或 LOH（大型对象）中分配。只有垃圾回收器可以在第1代（通过提升第0代回收未处理的对象）和第2代（通过提升第1代和第2代回收未处理的对象）中&#8220;分配&#8221;对象。触发垃圾回收后，垃圾回收器将寻找存在的对象并将它们压缩。如果没有足够的可用空间来容纳大型对象分配请求，我会先尝试从操作系统获取更多段。如果失败，我将触发第 2 代垃圾回收以便释放一些空间。</span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">如果大家还有所怀疑，可以看看下面windbg+sos<span style="font-family: 宋体">来看看一个用户态运行的程序的</span>GC Heap<span style="font-family: 宋体">里面都是些什么：</span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Verdana">Number of GC Heaps: 1<br />
<strong>generation 0 starts at 0x013d1018<br />
generation 1 starts at 0x013d100c<br />
generation 2 starts at 0x013d1000<br />
</strong>ephemeral segment allocation context: none<br />
&nbsp;segment&nbsp;&nbsp;&nbsp; begin allocated&nbsp;&nbsp;&nbsp;&nbsp; size<br />
<strong>001b09f8 7a733370&nbsp; 7a754b98 0x00021828(137256)<br />
001b3fc0 7b463c40&nbsp; 7b47a744 0x00016b04(92932)<br />
0014df68 790d8620&nbsp; 790f7d8c 0x0001f76c(128876)<br />
013d0000 013d1000&nbsp; 01425ff4 0x00054ff4(348148)<br />
</strong>Large object heap starts at 0x023d1000<br />
&nbsp;segment&nbsp;&nbsp;&nbsp; begin allocated&nbsp;&nbsp;&nbsp;&nbsp; size<br />
<strong>023d0000 023d1000&nbsp; 023d8e00 0x00007e00(32256)<br />
</strong>Total Size&nbsp;&nbsp; 0xb488c(739468)<br />
------------------------------<br />
GC Heap Size&nbsp;&nbsp; 0xb488c(739468)<br />
我们一个<span lang="EN-US">GC Heap</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面有四个</span><span lang="EN-US">Heap Segment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，紧接着</span><span lang="EN-US">Heap Segment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，是</span><span lang="EN-US">LOH</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这些Generation<span style="font-family: 宋体">是保存在一个一个的</span><span lang="EN-US"><span lang="EN-US">Heap Segment</span></span><span style="font-family: 宋体">里面的。一个</span>Heap Segment<span style="font-family: 宋体">可以包含两个</span>Generation<span style="font-family: 宋体">或者三个，或者更多。而一个</span>Generation<span style="font-family: 宋体">可以跨越多个</span>Heap Segment<span style="font-family: 宋体">。<span style="font-family: 宋体">紧接着</span>GC Heap<span style="font-family: 宋体">的内存区域，就是</span>LOH<span style="font-family: 宋体">。在默认情况下，超过</span>85000byte<span style="font-family: 宋体">的对象就被保存到这里。</span></span></span></font></span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Verdana"></font></span></span></span><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Verdana"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;</p>
<div class="ArticleTypeTitle" id="id0070017"><strong>何时回收大型对象</strong></div>
<div class="ArticleTypeTitle"><span class="ArticleInlineTitle">分配超出第 0 代或大型对象阈值</span></div>
<div class="ArticleTypeTitle"><span class="ArticleInlineTitle">调用 System.GC.Collect</span> 如果对第 2 代调用 GC.Collect,将立即回收 LOH 及其他托管堆。</div>
<div class="ArticleTypeTitle"><span class="ArticleInlineTitle">系统内存太低</span></div>
<div class="ArticleTypeTitle">&nbsp;</div>
<div class="ArticleTypeTitle"><strong>LOH 性能</strong></div>
<div class="ArticleTypeTitle">CLR选择扫过所有对象，扫描一遍来判断这个对象有没有对别的对象的引用。如果有的话，这一类对象就会存储在一起，而没有对其它对象引用的对象就会存在其余的另外一个区域。这样做是基于性能考虑的。</div>
<div class="ArticleTypeTitle">们来看一下回收成本。前面曾提到，LOH 和第2代将一起回收。如果超过两者中任何一个的阈值，都会触发第2代回收。如果由于第2代为 LOH 而触发了第2代回收，则第 2 代本身在垃圾回收后不一定会变得更小。因此，如果第2代中的数据不多，这将不是问题。但是，如果第2代很大，则触发多次第2代垃圾回收可能会产生性能问题。毫无疑问，如果仍继续分配和处理真正的大型对象，分配成本肯定会大幅增加。</div>
<div class="ArticleTypeTitle">我们可以看看上面的调试结果，我们可以看到</div>
<div class="ArticleTypeTitle">Large object heap starts at 0x023d1000<br />
&nbsp;segment&nbsp;&nbsp;&nbsp; begin allocated&nbsp;&nbsp;&nbsp;&nbsp; size<br />
<strong>023d0000 023d1000&nbsp; 023d8e00 0x00007e00(32256)</strong></div>
<div>您会看到 LOH 的总大小少于 85,000 个字节。为什么会这样？这是因为运行时本身实际使用LOH分配某些小于大型对象的对象。在看看下面的调试代码（LOH的内存段）</div>
<div><font face="Verdana">0:011&gt; !dumpheap -stat 023d1000&nbsp; 023d8e00 <br />
total 17 objects<br />
Statistics:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp; Count&nbsp;&nbsp;&nbsp; TotalSize Class Name<br />
0014c090&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Free<br />
7912d8f8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32112 System.Object[]<br />
Total 17 objects</font><br />
大型对象费用很高。由于 CLR 需要清除一些新分配大型对象的内存，以满足 CLR 清除所有新分配对象内存的保证，所以分配成本相当高。LOH 将与堆的其余部分一起回收，如果可以，建议重新使用大型对象以避免托管堆。LOH 上的特大对象通常是数组（很少会有非常大的实例对象）。如果数组元素包含很多引用，则成本将会很高。如果元素不包含任何引用，则根本无需处理此数组。最后，到目前为止，在回收过程中尚不能压缩 LOH，但不应依赖于此实现。因此，要确保某些内容未被GC移动，请始终将其固定起来。</div>
</span></span></span></font></span></span></span>
<img src ="http://www.cnblogs.com/gjcn/aggbug/1248587.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41819/" target="_blank">[新闻]英特尔雅虎开发网络计算机频道</a>]]></description></item><item><title>CLR系列：窥视HashTable</title><link>http://www.cnblogs.com/gjcn/archive/2008/07/07/1234560.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Mon, 07 Jul 2008 01:59:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/07/07/1234560.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1234560.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/07/07/1234560.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1234560.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1234560.html</trackback:ping><description><![CDATA[摘要: 哈希表(Hashtable)简述我想大家对Hashtable很熟悉，平时在工作中使用的也是比较多的，现在都是3.5了，Dictionary 的出现已经可以替代Hashtable，但是我还是想对这个Net框架使用较多的对象(举个例子：Net的CLR处理一个程序集的字符串就是采用HashTable存储在System Domain)讲解一下，因为很多新的技术都是建立在老的技术和思想上的。在.NET Fr&nbsp;&nbsp;<a href='http://www.cnblogs.com/gjcn/archive/2008/07/07/1234560.html'>阅读全文</a><img src ="http://www.cnblogs.com/gjcn/aggbug/1234560.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41818/" target="_blank">[新闻]Windows Live视频邮件9月9日开始测试</a>]]></description></item><item><title>c#3.0系列：Object Initializer 和 Collection Initializer</title><link>http://www.cnblogs.com/gjcn/archive/2008/04/15/1154071.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Tue, 15 Apr 2008 03:21:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/04/15/1154071.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1154071.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/04/15/1154071.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1154071.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1154071.html</trackback:ping><description><![CDATA[摘要: 对象初始化器(Object Initializers) 和 集合初始化器(Collection Initializers)，就是简化我们的代码，让本来几行才能写完的代码一行写完。这样在LINQ的使用中，我们才不会把一个LINQ表达式写的复杂。 Object InitializersObject Initializer的使用很简单：在通过new 关键字创建对象的时候，将所需的Proeprty置于Ty&nbsp;&nbsp;<a href='http://www.cnblogs.com/gjcn/archive/2008/04/15/1154071.html'>阅读全文</a><img src ="http://www.cnblogs.com/gjcn/aggbug/1154071.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41817/" target="_blank">[新闻]Intel首次公开展示Nehalem架构迅驰3平台</a>]]></description></item><item><title>c#3.0系列：Extension Method</title><link>http://www.cnblogs.com/gjcn/archive/2008/04/11/1148298.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Fri, 11 Apr 2008 05:16:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/04/11/1148298.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1148298.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/04/11/1148298.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1148298.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1148298.html</trackback:ping><description><![CDATA[摘要: 我们说在C#3.0中，引入了一些列新的特性，但是个人认为Extension Method这个特性是最爽的，最有创新的。它真正的解决了：在保持现有Type原封不动的情况下对其进行扩展，你可以在对Type的定义不做任何变动的情况下，为之添加所需的方法成员。下面我就来讲讲。C#3.X出来之前大家都知道javascript有个特新Prototype，它就如同C#3.X中的Extension Method。&nbsp;&nbsp;<a href='http://www.cnblogs.com/gjcn/archive/2008/04/11/1148298.html'>阅读全文</a><img src ="http://www.cnblogs.com/gjcn/aggbug/1148298.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41816/" target="_blank">[新闻]Pogo浏览器</a>]]></description></item><item><title>c#3.0系列：Automatic Property</title><link>http://www.cnblogs.com/gjcn/archive/2008/04/10/1146387.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Thu, 10 Apr 2008 03:06:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/04/10/1146387.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1146387.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/04/10/1146387.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1146387.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1146387.html</trackback:ping><description><![CDATA[摘要: 之前的做法：在c#3.x出来之前，相信大家已经习惯通过一个private field + public property的发式来定义和实现一个public Property。就如下面方式实现。1classperson2{3privateintage;4privatestring_name;5publicintAge6{7get{returnage;}8set{age=value;}9}10publ&nbsp;&nbsp;<a href='http://www.cnblogs.com/gjcn/archive/2008/04/10/1146387.html'>阅读全文</a><img src ="http://www.cnblogs.com/gjcn/aggbug/1146387.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41807/" target="_blank">[新闻]洪磊口述:番茄花园如何捆绑流氓软件月入十万</a>]]></description></item><item><title>c#3.0系列：Anonymous Type In CLR(3.5)</title><link>http://www.cnblogs.com/gjcn/archive/2008/04/09/1144851.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Wed, 09 Apr 2008 06:19:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/04/09/1144851.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1144851.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/04/09/1144851.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1144851.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1144851.html</trackback:ping><description><![CDATA[摘要: 我们说Anonymous Type是C# 3.0的新的特性，而没有说Anonymous Type是.NET Framework 3.5的新特性。这是因为Anonymous Type仅仅是.NET Programming Language和相应的Compiler的新引入的特征。而对于.NET Framework 3.5来说，它看不到这和原来有什么不同，对于Anonymous Type和一般的Name&nbsp;&nbsp;<a href='http://www.cnblogs.com/gjcn/archive/2008/04/09/1144851.html'>阅读全文</a><img src ="http://www.cnblogs.com/gjcn/aggbug/1144851.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41813/" target="_blank">[新闻]2008年8月21日IT博客精选：盖茨复出？</a>]]></description></item><item><title>Quiz:who win in finally vs return? </title><link>http://www.cnblogs.com/gjcn/archive/2008/03/05/1091536.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Wed, 05 Mar 2008 03:45:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/03/05/1091536.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1091536.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/03/05/1091536.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1091536.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1091536.html</trackback:ping><description><![CDATA[摘要: 废话就不多讲了，直接看看下面的例子。1）static int Test() { int val = 1; try { return val; } finally { val = 2; } }2）static int s_val; static int Test() { s_val = 1; try { return s_val; } finally { s_val = 2; } }请问这两个例子最&nbsp;&nbsp;<a href='http://www.cnblogs.com/gjcn/archive/2008/03/05/1091536.html'>阅读全文</a><img src ="http://www.cnblogs.com/gjcn/aggbug/1091536.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41812/" target="_blank">[新闻]微软宣布将斥资1亿美元购买Novell证书</a>]]></description></item><item><title>Inside C#(一些内部实现的东西)</title><link>http://www.cnblogs.com/gjcn/archive/2008/03/04/1089920.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Tue, 04 Mar 2008 03:36:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2008/03/04/1089920.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/1089920.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2008/03/04/1089920.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/1089920.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/1089920.html</trackback:ping><description><![CDATA[ILDASM是个好的工具，平时也很喜欢用，它能帮助我更好的了解NET。以下我的总结，请执教。<br />
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">You write: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">public enum Compression&nbsp;{ </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; Zip, SuperZip, None </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;} <br />
</p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">The C# compiler generates: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">public struct Compression : Enum { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; public int value__; </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; public const Compression Zip = 0; </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; public const Compression SuperZip = 1; </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; public const Compression None = 2; </span></p>
<p style="margin: 0in 0in 0pt"><span>} <br />
<strong>What can we learn:<o:p></o:p> <br />
</strong>1）<span style="font-size: 10pt; font-family: Arial">Enums 是struct ，内部成员即是struct 也是Enum 。<br />
2）Enum 继承System.Enum 的，structs可以继承ValueType,也可以是Enum 。<br />
3）Enum 内部成员默认是Int的。<br />
4）变量含有&#8221;__&#8220;的不能使用。<br />
5）所有的值都是const 的，因此在没有重新编译的时候是不能改变的，而且也是类型安全的。<br />
</span></span><span><span style="font-size: 10pt; font-family: Arial">&nbsp;</p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">You write: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">public class Resource </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">{ </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; ~Resource() { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;} </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">} </span></p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">The C# compiler generates: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">public class Resource </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">{ </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; protected override void Finalize() { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Finalize(); </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; } </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">} </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: Arial"><strong>What can we learn: <br />
</strong><font style="background-color: #ffffff">1）解析函数是重写基类的finalize 的。且是不确定的。<br />
2）method (represented by the &#8220;&#8230;&#8221;)是放在Try里，无论有没有异常都会调用基类的finalize 。<br />
<br />
</p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">You write: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">using (Resource res = new Resource()) { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; res.DoWork(); </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">} </span></p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">The C# compiler generates: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">Resource res = new Resource(...); </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">try { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; res.DoWork(); </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">} </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">finally { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; if (res != null) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((IDisposable)res).Dispose(); </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">} </span></p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">What can we learn: </span></strong></p>
<p style="margin: 0in 0in 0pt">使用<span style="font-size: 10pt; font-family: 'Courier New'">using </span>会被编译成try，且会始终执行Dispose方法（基于CLR的异常）。<br />
<br />
</p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">You write: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">object x = ... ; </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">lock (x) { </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; // critical section </span></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">} </span></p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">The C# compiler generates: </span></strong></p>
<p style="margin: 0in 0in 0pt"><span style="font-size: 10pt; font-family: 'Courier New'">System.Threading.Monitor.Enter(x);<br />
try {<br />
&nbsp;&nbsp; // critical section<br />
}<br />
finally {<br />
&nbsp;&nbsp; System.Threading.Monitor.Exit(x);<br />
} </span></p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">What can we learn: <br />
</span></strong><span style="font-size: 10pt; font-family: Arial">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: Arial">Lock just uses Monitor.Enter and Exit&#8230; reading those docs give you a good idea of what is really happening here. <br />
</span><span style="font-size: 10pt; font-family: Arial">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: Arial">We see our friend try..finally again. This time ensuring that the monitor is exited even if an exception is thrown in the critical section <br />
<br />
<strong><span style="font-size: 10pt; font-family: Arial">You write: </span></strong><br />
ArrayList list = new ArrayList(); <br />
foreach(int x in list) { // do nothing } <br />
</span></p>
<p style="margin: 0in 0in 0pt"><strong><span style="font-size: 10pt; font-family: Arial">The C# compiler generates: </span></strong><br />
ArrayList list1; <br />
int num1; <br />
IEnumerator enumerator1; <br />
IDisposable disposable1; <br />
list1 = new ArrayList(); <br />
enumerator1 = list1.GetEnumerator(); <br />
try {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (enumerator1.MoveNext()) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1 = ((int) enumerator1.Current);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;} <br />
finally {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disposable1 = (enumerator1 as IDisposable);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (disposable1 != null) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disposable1.Dispose();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</font></span></p>
</span></span></span>
<img src ="http://www.cnblogs.com/gjcn/aggbug/1089920.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41811/" target="_blank">[新闻]携程谷歌将联合发旅游榜单</a>]]></description></item><item><title>Multi-Language of web application project</title><link>http://www.cnblogs.com/gjcn/archive/2007/09/03/880110.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Mon, 03 Sep 2007 05:26:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2007/09/03/880110.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/880110.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2007/09/03/880110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/880110.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/880110.html</trackback:ping><description><![CDATA[<p>由于项目的需要,最近完成了一个支持多语言的系统实现.<br />
我用的是App_GlobalResources全局资源文件配置.<br />
命名空间是<br />
using System.Threading<br />
using System.Resources<br />
using System.Globalization<br />
using System.Reflection</p>
<p>知道大家都已经熟悉了,代码不多讲,后面附有下载,欢迎大家提出批评.谢谢!<br />
<br />
实现方法还有App_LocalResources,但是每个页面都要一个配置文件,麻烦啊.方法类似.<br />
<br />
个人感觉用数据库存资源文件的内容似比较好的方式.<br />
大家还有别的实现方法吗(编码方式,不用第三方组件)?<br />
<br />
代码下载:<a href="/Files/gjcn/WebSite3.rar">/Files/gjcn/WebSite3.rar</a></p>
 <img src ="http://www.cnblogs.com/gjcn/aggbug/880110.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41810/" target="_blank">[新闻]商刊:Google不可能永远领先 微软寄希望于时间</a>]]></description></item><item><title>ASP.NET应用程序的文件组成及编译过程</title><link>http://www.cnblogs.com/gjcn/archive/2007/08/31/876832.html</link><dc:creator>gjcn</dc:creator><author>gjcn</author><pubDate>Fri, 31 Aug 2007 01:59:00 GMT</pubDate><guid>http://www.cnblogs.com/gjcn/archive/2007/08/31/876832.html</guid><wfw:comment>http://www.cnblogs.com/gjcn/comments/876832.html</wfw:comment><comments>http://www.cnblogs.com/gjcn/archive/2007/08/31/876832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/gjcn/comments/commentRss/876832.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/gjcn/services/trackbacks/876832.html</trackback:ping><description><![CDATA[<p class="22">在一个ASP.NET应用程序中有许多保留文件夹</p>
<p class="42">1. Bin文件夹</p>
<p class="22">Bin文件夹包含应用程序所需的，用于控件、组件或者需要引用的任何其他代码的可部署程序集。该目录中存在的任何.dll文 件将自动地链接到应用程序。如果在该文件夹中留有不用的或过期的文件，则可能出现&#8220;二义性引用(ambiguous reference)&#8221;异常的风险。换句话说，如果两个不同的程序集定义相同的类(相同的命名空间和名称)，则ASP.NET运行库不能决定应该使用哪一 个程序集，从而抛出一个异常。在开发时，当我们重新命名一个项目或一个程序集的名称时，这是常见的错误。为了避免这种错误，一定不要在该文件夹中保留任何 不必要的程序集，或者至少要从配置文件的&lt;assemblies&gt;节中删除如下代码行：</p>
<p class="23">&lt;add assembly="*" /&gt;</p>
<p class="22">在表1.10所列的所有文件夹中，只有Bin可以被ASP.NET 1.x应用程序识别。该文件夹是强制性的。</p>
<p class="42">2. App_Browser文件夹</p>
<p class="22">该可选的文件夹包含.browser文件。.browser文件描述浏览器(不管是移动设备浏览器，还是台式机浏览器)的特 征和功能。ASP.NET在安装路径下的Config\Browser文件夹中安装了大量.browser文件，这些文件供所有应用程序共享。我们只是把 当前应用程序特有的浏览器文件放在App_Browser文件夹下。.browser文件的内容即时动态地进行编译，以便向ASP.NET运行库提供最新 的浏览器信息。</p>
<p class="22">让我们简单谈谈拥有一个自定义的.browser文件可能有帮助的场景。设想应用程序使用了一个在某个浏览器下不能有效呈现的控件。在指定的浏览器中显示宿主页面时，可以编写一个.browser文件，迫使ASP.NET使用一个不同的适配器来生成该控件。</p>
<p class="23">&lt;browsers&gt;</p>
<p class="23">&lt;browser id="browserID"&gt;</p>
<p class="23" style="text-indent: 8.4pt">&lt;controlAdapters&gt;</p>
<p class="23" style="text-indent: 16.8pt">&lt;adapter controlType="Samples.CustomControl"</p>
<p class="23" style="text-indent: 63pt">adapterType="Samples.Adapters.CustomControlAdapter" /&gt;</p>
<p class="23" style="text-indent: 8.4pt">&lt;/controlAdapters&gt;</p>
<p class="23">&lt;/browser&gt;</p>
<p class="23">&lt;/browsers&gt;</p>
<p class="22">假设browserID与ASP.NET识别的标准浏览器之一相匹配，则上文所示的.browser文件指示在指定的浏览器下使用CustomControlAdapter呈现CustomControl。</p>
<p class="42">3. App_Code文件夹</p>
<p class="22">App_Code文件夹正好在Web应用程序根目录下，其存储所有应当作为应用程序的一部分动态编译的类文件。这些类文件自 动链接到应用程序，而不需要在页面中添加任何显式指令或声明来创建依赖性。App_Code文件夹中放置的类文件可以包含任何可识别的ASP.NET组件 ——自定义控件、辅助类、build提供程序、业务类、自定义提供程序、HTTP处理程序等。</p>
<p class="2050505">&nbsp;&nbsp; 注意&nbsp;&nbsp;&nbsp;&nbsp; 在开发时，对App_Code文件夹的更改会导致整个应用程序重新编译。对于大型项目，这可能不受欢迎，而且很耗时。为此，鼓励大家将代码进行模块化处理 到不同的类库中，按逻辑上相关的类集合进行组织。应用程序专用的辅助类大多应当放置在App_Code文件夹中。</p>
<p class="22">App_Code文件夹中存放的所有类文件应当使用相同的语言。如果类文件使用两种或多种语言编写，则必须创建特定语言的子目录，以包含用每种语言编写的类。一旦根据语言组织这些类文件，就要在web.config文件中为每个子目录添加一个设置：</p>
<p class="23">&lt;compilation&gt;</p>
<p class="23" style="text-indent: 18.9pt">&lt;codeSubDirectories&gt;</p>
<p class="23" style="margin-left: 38.85pt; text-indent: 18.9pt">&lt;add directoryName="VBFolder" /&gt;</p>
<p class="23" style="text-indent: 18.9pt">&lt;/codeSubDirectories&gt;</p>
<p class="23">&lt;/compilation&gt;</p>
<p class="22">重要的是，特定语言的子目录应在web.config文件中注册，否则，不管它们属于哪个文件夹，App_Code文件夹下 的所有文件将被编译成一个单独的程序集。上述配置脚本描述了这么一种情况，即所有的C#文件都放在App_Code文件夹的根目录下，而把几个 Visual Basic .NET类文件移入VBFolder目录中。如果&lt;codeSubDirectories&gt;节中提到的目录不存在，则会收到一个编译错误提 示。</p>
<p class="22">App_Code根文件夹中的文件被编译成App_Code_xxx.dll程序集，其中xxx是随机生成的字符序列。一个 给定子目录中的文件将被编译成一个名为App_SubCode_xxx_yyy.dll的动态创建的程序集，其中xxx指示子目录的名称，而yyy是一个 随机字符序列。只有在应用程序根目录中的web.config文件中进行了设置，&lt;codeSubDirectories&gt;节才有效。</p>
<p class="22">在App_Code目录或任何其他子目录中放置一个assemblyinfo.cs文件，可以创建一个强命名的程序集。显然，如果该文件夹包含Visual Basic .NET文件，那么将使用assemblyinfo.vb文件。程序集配置文件可以引用一个.snk文件来保存强名称的密钥。</p>
<p class="2050505">注意&nbsp;&nbsp;&nbsp;&nbsp; 给一个程序集设置一个强名称，首先必须获得一个公开/私有密钥对。通过使用强名称(Strong Name)工具(sn.exe)，可以获得这样一个密钥对。强名称工具是我们可以在.NET Framework的安装路径中发现的SDK binary之一。密钥对文件通常有一个.snk扩展名。可以将该文件保存到一个应用程序文件夹中，并在assemblyinfo.cs文件中引用它，如下所示：</p>
<p class="23">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [assembly: AssemblyKeyFileAttribute(@"yourKeyPair.snk")]</p>
<p class="2050505" style="margin-left: 52.5pt; text-indent: 0cm">注意，Visual Basic .NET是在包含Visual Studio Solution的目录中寻找密钥文件，而C#编译器则在包含该binary的目录中寻找密钥文件。据此可知，用此属性调整我们使用的路径，或者把密钥文件放在合适的文件夹中。</p>
<p class="22">在随后发生的任何重新生成中，程序集的名称将发生变化。同时，老的AppDomain请求一结束，就删除老的程序集。</p>
<p class="22">App_Code文件夹并非只能包含类文件。特别是，它可以包含并能自动地处理代表数据架构的XSD文件。把一个XSD文件 添加到该文件夹中时，编译器将把它解析成一个有类型的DataSet类，并将它添加到应用程序作用域中。在ASP.NET 1.x中，这一工作由Visual Studio .NET向导，使用一个命令行实用程序(xsd.exe)完成的。</p>
<p class="2050505">&nbsp;&nbsp; 注意&nbsp;&nbsp;&nbsp;&nbsp; 使用web.config文件注册一个组件(例如，一个自定义的服务器控件或一个自定义的HTTP处理程序)时，通常要求指定包含该代码的程序集名称。如 果该组件定义在App_Code文件夹中，则应该用什么名称来指示程序集？在这种情况下，只是忽略程序集信息，并规定完整的类名即可。如果没有规定任何程 序集，则ASP.NET运行库将试图从任何已装载的程序集中装入该类，包括为App_Code文件夹动态创建的程序集。</p>
<p class="42">4. App_Data文件夹</p>
<p class="22">App_Data文件夹应该包含应用程序的本地数据存储。它通常以文件(诸如Microsoft Access或Microsoft SQL Server Express数据库、XML文件、文本文件以及应用程序支持的任何其他文件)形式包含数据存储。该文件夹内容不由ASP.NET处理。该文件夹是ASP.NET提供程序存储自身数据的默认位置。</p>
<p class="2050505">注意&nbsp;&nbsp;&nbsp;&nbsp; 默认ASP.NET帐户被授予对文件夹的完全访问权限。如果碰巧要改变ASP.NET帐户，一定要确保新帐户被授予对该文件夹的读/写访问权。</p>
<p class="42">5. App_GlobalResources文件夹</p>
<p class="22">正如其他应用程序一样，ASP.NET应用程序也可以使用资源，而且通常应该使用资源。资源是隔离应用程序用户界面的可局部 化部分的一种有效方法。一般而言，资源是与程序相关的不可执行的文本。典型的资源有图像、图标、文本和附属文件，但是任何可序列化的对象也可以被看作资 源。应用程序资源存储在应用程序的外部，这样就能在不影响和重新编译应用程序本身的情况下重新编译和替换它们。</p>
<p class="22">ASP.NET应用程序需要有一个主要程序集来保存应用程序默认的或中性的资源。此外，还要部署许多附属程序集，它们中各自 包含我们需要支持的某种文化的本地化资源。在ASP.NET 1.x中，编译一个程序集内的资源有点麻烦。需要手动地将基于XML的资源文件(那些带.res扩展名的资源)编译成.resources二进制文件。这 些文件既可以嵌入到一个.NET可执行文件中，也可以编译成附属程序集。使用资源文件生成器实用程序resgen.exe，将文本和基于XML的资源文件 转变为.resource文件。资源文件名称遵循baseName.cultureName.resource命名约定，其中baseName通常是应用 程序的名称：</p>
<p class="23">resgen.exe ProAspNet20.resx ProAspNet20.it.resources</p>
<p class="22">创建.resource文件以后，应当把它嵌入到一个程序集中，甚至可以作为一个资源容器来使用。要把一个资源文件嵌入到一个附属程序集中，可以使用程序集连接器工具(al.exe)。在命令行上，指出程序集所使用的文化(如下面示例中的it，它代表意大利)和名称。</p>
<p class="23">al /out:ProAspNet20.resources.dll /c:it /embed:ProAspNet20.it.resources</p>
<p class="22">在编译附属程序集之后，它们将有相同的名称。将它们部署到不同的子目录中，分别按文化命名。</p>
<p class="22">幸运的是，对于ASP.NET 2.0，附属程序集的时代已经一去不复返了。更准确地说，附属程序集仍然存在，但是由于App_GlobalResources保留文件夹，对开发人员来说它们已经成为过去的事情。</p>
<p class="22" style="text-indent: 20.6pt">该文件夹中的任何定位的.resx文件自动地被编译成附属程序 集。.resx文件的名称包含文化信息，以帮助ASP.NET运行库环境的程序集生成。如下文件，resources.resx, resources.it.resx, resources.fr.resx，生成中性程序集以及适合于意大利(Italian)和法国(French)文化的附属程序集。如果没有要求特定文 化，则中性程序集是默认的文化资源。</p>
<p class="22">App_GlobalResources文件夹中的资源文件是应用程序的全局资源，因而可以从任何页面中引用它。和ASP.NET 1.x相比资源读取结果也极大地简化了：</p>
<p class="23">&lt;asp:Label Runat="server" Text="&lt;%$ Resources:ResxFile, MyResName %&gt;" /&gt;</p>
<p class="22">可以使用最新的称为Resources的$-表达式以声明的方式绑定全局资源(第5章将详细介绍$-表达式)。该表达式包括两个参数：.resx资源文件的名称(没有扩展名)，以及要检索的资源的名称。以编程的方式访问资源，请使用如下代码：</p>
<p class="23">HttpContext.GetGlobalResourceObject(resxFile, MyResName)</p>
<p class="22">这两个参数都是字符串，并且与$-表达式中的参数具有相同的作用。此外，$-表达式Resources的实现在内部使用GetGlobalResourceObject。</p>
<p class="42">6. App_LocalResources文件夹</p>
<p class="22">App_LocalResources文件夹位于包含一些ASP.NET页面的文件夹下的一个子目录。该文件夹可以使用位于 目录结构中高一级目录中的页面命名的.resx文件进行填充。假定父文件夹包含test.aspx，则可以在App_LocalResources文件夹 中找到一些可用的资源文件如下：test.aspx.resx、test.aspx.it.resx和test.aspx.fr.resx。显然，上述文 件中存储的资源仅对test.aspx页面有影响，因而只能在链接的页面中看见它们(可以使用它们)。</p>
<p class="22">如何访问一个页面特有的资源呢？对于编程访问，可使用如下代码：</p>
<p class="23">HttpContext.GetLocalResourceObject("/ProAspNet20/ResPage.aspx",</p>
<p class="23" style="text-indent: 176.4pt">"PageResource1.Title")</p>
<p class="22">第1个参数指出页面虚拟路径；第2个参数是资源名称。对于声明式访问，使用meta:ResourceKey属性。例如，</p>
<p class="23">&lt;asp:Button Runat="server" meta:resourcekey="ButtonResource1" /&gt;</p>
<p class="22">该声明将一个惟一的资源键与特定按钮实例关联。局部文件.resx包含prefix.name形式的条目，其中prefix 是资源键，而name是绑定控件上的属性名。为了赋予按钮一个本地化标题(Text属性)，只要在资源文件中创建一个 ButtonResource1.Text条目即可。</p>
<p class="22">局部和全局资源文件夹中存在的资源文件都被编译，以创建附属程序集的类。最后的结果是开发人员创建.resx文件，并测试该页面。而ASP.NET编译机制会完成其余工作。</p>
<p class="42">7. App_Themes文件夹</p>
<p class="22">App_Themes文件夹为ASP.NET控件定义主题。主题包含在App_Themes文件夹下的一个文件夹。根据定义，一个主题是一组带有样式信息的文件。主题文件夹中的文件内容被编译，以生成一个类，而该类被页面调用以编程的方式设置主题化控件的样式。</p>
<p class="22">App_Themes文件夹列出应用程序的本地主题。 应用程序还可以继承如下文件夹中定义的全局主题：</p>
<p class="23">%WINDOWS%\Microsoft.NET\Framework\[version]\ASP.NETClientFiles\Themes</p>
<p class="22">从编译的角度看，全局主题和局部主题没有区别。如果一个给定名称的主题，既存在应用程序的本地主题，又存在服务器机器的全局主题，则本地主题优先适用。</p>
<p class="42">8. App_WebReferences文件夹</p>
<p class="22">在Visual Studio .NET 2003中，一个需要访问Web服务的ASP.NET应用程序，将通过&#8220;添加Web引用&#8221;对话框获得相应的.wsdl文件。Web服务的WSDL(Web Service Description Language)文档，对于从页面使用Web服务是不够的。ASP.NET页面最终是一个托管类，并且需要与另一个托管类通信。因此，Web服务被一个 代理类所包装。该代理类是由Visual Studio使用命令行工具wsdl.exe的服务创建的。该代理类尽量包含与Web服务商的Web方法一样多的方法，并且它结合了Web服务的公共接口 定义的任何自定义的数据类型。</p>
<p class="22">这个操作不需要开发人员付出很大的代价。然而，开发人员显然要依赖于Visual Studio来生成代理类。如果能够直接把.wsdl文件放在应用程序的目录树的某个地方，并让ASP.NET处理其余的任务，这样不是更容易、更简单 吗？这正好是App_WebReferences文件夹要做的事情。</p>
<p class="22">它识别那些用来描述所绑定的Web服务的.wsdl文件，并生成运行时代理类，以便ASP.NET页面能够以类型安全的方式 放置对Web服务的调用。App_WebReferences文件夹可以包含子文件夹。子文件夹的名称驱动最后所得到的代理类的命名空间，而WSDL文件 定义类名。例如，samples.wsdl文件和ProsAspNet20子文件夹将创建一个称为ProAspNet20.Samples的代理类。该动 态创建的程序集称为App_WebReferences.xxx.dll，其中xxx是一个随机的字符序列。</p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="95%" border="1">
    <tbody>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: 1.5pt solid; padding-left: 5.4pt; background: rgb(217,217,217) 0% 50%; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" valign="top" width="130">
            <p class="14">文件夹名称</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: 1.5pt solid; padding-left: 5.4pt; background: rgb(217,217,217) 0% 50%; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" valign="top" width="115">
            <p class="14">文件类型</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: 1.5pt solid; padding-left: 5.4pt; background: rgb(217,217,217) 0% 50%; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial" valign="top" width="303">
            <p class="14">注&nbsp;&nbsp;&nbsp;&nbsp; 释</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="130">
            <p class="a2">Bin</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="115">
            <p class="a2">.dll</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="303">
            <p class="a2">包含应用程序所需的任何预生成的程序集</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="130">
            <p class="a2">App_Browsers</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="115">
            <p class="a2">.browser</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="303">
            <p class="a2">包含应用程序特有的浏览器定义文件，ASP.NET用它来识别各浏览器及确定它们的功能</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="130">
            <p class="a2">App_Code</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="115">
            <p class="a2">.cs、.vb、.xsd、自定义的文件类型</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="303">
            <p class="a2">包含作为应用程序的一部分编译的类的源文件。当页面被请求时，ASP.NET编译该文件夹中的代码。该文件夹中的代码在应用程序中自动地被引用</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="130">
            <p class="a2">App_Data</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="115">
            <p class="a2">.mdb、.mdf、.xml</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="303">
            <p class="a2">包含Microsoft Office Access和SQL Express文件以及XML文件或其他数据存储</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="130">
            <p class="a2">App_GlobalResources</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="115">
            <p class="a2">.resx</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="303">
            <p class="a2">包含在本地化应用程序中以编程方式使用的资源文件</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="130">
            <p class="a2">App_LocalResources</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="115">
            <p class="a2">.resx</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="303">
            <p class="a2">包含页面范围的资源文件</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="130">
            <p class="a2">App_Themes</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="115">
            <p class="a2">.skin、.<a href="http://www.lvjiyong.com/en-us/category/CSS">CSS</a>、.xsl、附属文件</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1pt solid" valign="top" width="303">
            <p class="a2">包含一组定义ASP.NET页面和控件外观的文件</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 97.45pt; padding-top: 0cm; border-bottom: 1.5pt solid" valign="top" width="130">
            <p class="a2">App_WebReferences</p>
            </td>
            <td style="border-right: 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 86.45pt; padding-top: 0cm; border-bottom: 1.5pt solid" valign="top" width="115">
            <p class="a2">.wsdl</p>
            </td>
            <td style="border-right: medium none; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 227.2pt; padding-top: 0cm; border-bottom: 1.5pt solid" valign="top" width="303">
            <p class="a2">包含用以生成代理类的WSDL文件，以及与在应用程序中使用Web服务有关的其他文件</p>
            </td>
        </tr>
    </tbody>
</table>
 <img src ="http://www.cnblogs.com/gjcn/aggbug/876832.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41809/" target="_blank">[新闻]微软下周四将发布IE 8 Beta 2,正式版将于11月推出</a>]]></description></item></channel></rss>