<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[RoyeeFish's Blog]]></title> 
<link>http://blog.royee.com/index.php</link> 
<description><![CDATA[如易小鱼的技术博客...]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[RoyeeFish's Blog]]></copyright>
<item>
<link>http://blog.royee.com/read.php/226.htm</link>
<title><![CDATA[为服务器端Form设置Action参数造成的异常]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ASP与.NET]]></category>
<pubDate>Tue, 03 Nov 2009 12:44:43 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/226.htm</guid> 
<description>
<![CDATA[ 
	今天改了下项目中的代码，本地测试正常，传到服务器报以下错误：<br/>Method not found: 'Void System.Web.UI.HtmlControls.HtmlForm.set_Action(System.String)'.<br/><br/>（空间装的是.NET2.0版本，通过前面讲的bin中加DLL的方法升级到3.5）<br/><br/>问题很可能是DLL的版本不兼容造成的，Google查到的结果是说.NET的Bug，但是到底是什么原因引起的，说的不是太明确。<br/><br/>因为改的地方太多，自己也记不清楚到底是改了什么地方引起了这个错误。<br/><br/>从所报的错误出发。set_Action实际是Action属性的set方法，所以估计是因为哪个地方设置了Form的Action属性造成的错误，想了一下自己确实设置了一个runat="server"的Form的Action属性。于是问题解决。<br/><br/><br/>总结：服务端的Form尽量不要设置其Action属性，不然会因为各.NET版本之前的差异产生类似问题。
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/225.htm</link>
<title><![CDATA[FCKEditor的上传问题]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Fri, 11 Sep 2009 06:36:55 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/225.htm</guid> 
<description>
<![CDATA[ 
	FCKEditor与ASP.NET集成后，本地测试正常，服务器上运行时在传图片的时候会提示关于权限的js错误。<br /><br />估计应该跟浏览器权限设置有关系，没有深究，以下是网上的解决方案：<br /><br /><p>到Fckeditor官方网站下载FredCK.FCKeditorV2.vs2005 (asp.net)</p><p>打开解决方案，</p><p>找到 FileBrowser/FileWorkerBase.cs 文件</p><p></p><p><span style="display: inline"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" border="0" align="top" /><span style="color: #000000">Response.Write( </span><span style="color: #800000">@&quot;</span><span style="color: #800000">(function()&#123;var d=document.domain;while (true)&#123;try&#123;var A=window.top.opener.document.domain;break;&#125;catch(e) &#123;&#125;;d=d.replace(/.*?(?:&#92;.&#124;$)/,'');if (d.length==0) break;try&#123;document.domain=d;&#125;catch (e)&#123;break;&#125;&#125;&#125;)();</span><span style="color: #800000">&quot;</span><span style="color: #000000"> );</span></span></p><p></p><p>修改成：</p><p><span style="display: inline"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" border="0" align="top" /><span style="color: #000000">Response.Write(</span><span style="color: #800000">@&quot;</span><span style="color: #800000">(function()&#123;var d=document.domain;while (true)&#123;try&#123;var A=window.top.opener.document.domain;break;&#125;catch(e) &#123;&#125;;d=d.replace(/.*?(?:&#92;.&#124;$)/,'');if (d.length==0) break;&#125;&#125;)();</span><span style="color: #800000">&quot;</span><span style="color: #000000">);</span></span></p><p></p><p>编译，将DLL文件拷贝覆盖你网站BIN目录的文件<br /><br /><br /><br />另：FCKEditor除了新的版本，更名为CKEditor，有时间研究下。。。<br /><br /></p><br/>Tags - <a href="http://blog.royee.com/go.php/tags/fckeditor/" rel="tag">fckeditor</a> , <a href="http://blog.royee.com/go.php/tags/%25E6%259D%2583%25E9%2599%2590/" rel="tag">权限</a> , <a href="http://blog.royee.com/go.php/tags/js%25E9%2594%2599%25E8%25AF%25AF/" rel="tag">js错误</a>
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/224.htm</link>
<title><![CDATA[关于在.NET2.0 空间上运行.NET3.5程序]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Fri, 11 Sep 2009 06:32:32 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/224.htm</guid> 
<description>
<![CDATA[ 
	<p>.NET3.5 与 .NET2.0 的 CLR 是相同的。<br />从IIS上更容易看得出来，IIS的ASP.NET配置里没有3.5的选项。<br /><br />所以3.5的程序运行在2.0的空间上是完全没有问题的，只需要解决几个Assembly引用即可。<br /><br />在安装.NET3.5的本地计算机上到C:&#92;WINDOWS&#92;assembly&#92;GAC_MSIL下各个对应的目录里找到：<br />System.Core.dll<br />System.Core.Resources.dll<br />System.Data.DataSetExtensions.dll<br />System.Data.DataSetExtensions.Resources.dll<br />System.Web.Extensions.dll<br />System.Web.Extensions.Resources.dll<br />System.Xml.Linq.dll<br />System.Xml.Linq.Resources.dll<br /><br />然后复制到网站发布后的bin目录里，就OK了。<br /><br />要注意的是C:&#92;WINDOWS&#92;assembly&#92;GAC_MSIL这个目录是普通方式是打不开的。<br />我是通过一个叫Everything的文件搜索工具进去的，你也可以从命令行进入找到所需的文件。<br /><br />当然，怕麻烦的话，从这下载吧。呵呵：<br /><a href="attachment.php?fid=2">点击这里下载文件</a><br /><br />另外，.NET2.0的空间不支持.NET3.5页面的动态编译（那是肯定的）。所以在发布的时候，请将&ldquo;允许更新此预编译站点&rdquo;勾掉，服务器端运行时会出现编译错误。<br /></p><br/>Tags - <a href="http://blog.royee.com/go.php/tags/asp.net/" rel="tag">asp.net</a> , <a href="http://blog.royee.com/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://blog.royee.com/go.php/tags/3.5/" rel="tag">3.5</a> , <a href="http://blog.royee.com/go.php/tags/2.0/" rel="tag">2.0</a> , <a href="http://blog.royee.com/go.php/tags/linq/" rel="tag">linq</a> , <a href="http://blog.royee.com/go.php/tags/%25E7%25A9%25BA%25E9%2597%25B4/" rel="tag">空间</a>
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/223.htm</link>
<title><![CDATA[Db4o主键问题续]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Wed, 02 Sep 2009 16:36:51 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/223.htm</guid> 
<description>
<![CDATA[ 
	前段时间写了那篇关于Db4o 主键问题的文章，应用时发现Guid类型的主键在数据删除后仍然留在数据文件中。<br /><br />分析发现Guid类型属于引用类型，Db4o将其当成实体对象保存了，然而在逻辑意义上我们并不认为Guid是以个实体数据。<br /><br />解决方法自然是有的，Db4o未删除Guid类型的ID，是因为未设置级联删除，在数据库开启前（必须是开启前设置）为类别设置级联删除即可，计提方式请参考相应文档。<br /><br />但是，Db4o在级联操作上的局限性就在于，只能对一个类别设置级联属性，而不能对单个属性设置（至少我现在没有发现相应的方法可以为单个属性设置级联属性）。这样的话仅仅为了一个ID就对该类设置级联删除是很不明智的，简单考虑一下文章与文章类别的例子就很容易发现了，我要删除文章的ID，就不得不删除文章所属的分类。。。<br /><br />不用级联删除还可以通过Db4o的事件特性来实现，具体点就是在数据的删除事件中删除他的ID。但是Guid值作为一个逻辑值类型，在数据库中是不止一份的（这个很难讲的明白，就像1 2 3 4这样的值类型，实际上Db4o在存储操作时，完全是把引用类型当值类型用的），当你删除的时候你实际上删除的不是某一个ID，而是数据库中所有的这个Guid。相当于关系型数据库中，我删除了父表中的一项，却没把子表中的引用项设空一样。破坏了数据完整性。<br /><br />所以最终解决方案是使用一个值类型的id（自动生成可以用Date.Now的滴答数来代替），这就不存在实体类被删除，ID还存在的情况。<br /><br />同样通过这一现象，我发现Db4o里面使用引用类型的字段是很不安全的，很容易造成数据库垃圾堆积（有点像C里面的内存泄露）。举个例子Subject为文章类型，Article为文章，很自然的我们会如下定义这两个类(.NET3.5)：<br /><br />class Article&#123;<br />&nbsp;&nbsp; public string Title&#123;get;set;&#125;<br />&nbsp;&nbsp; public Subject Subject;<br />&#125;<br /><br />class Subject&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;public string Name;<br />&#125;<br /><br />模拟一个基本流程：添加分类-&gt;添加文章-&gt;修改文章分类-&gt;删除文章<br /><br />首先添加分类会在数据库中创建一条关于分类的记录<br /><br />添加文章中的Subject属性在保存前会设定一个数据库中存在的分类，但是此处在保存文章时，又会产生一个相同的分类条目（感觉Db4o的Store方法设计有问题）<br /><br />修改文章分类的时候文章原来的分类是一个被复制的分类，再设置的时候又会有一条分类被复制，甚至于你仅仅修改文章的标题都会有一条分类条目被复制。<br /><br />不知道Db4o里面对这些&ldquo;孤岛数据&rdquo;有没有垃圾回收机制，数据库毕竟与面向对象环境不同，如果这些&ldquo;孤岛数据&rdquo;一直存在的话，数据库的急速增长是不可避免的（网上对此问题的抱怨也是有的）。<br /><br /><br />Db4o的思想很先进，确实给开发工作带来很大便利，可能在实现上还有一定问题，技术尚不成熟（虽然版本已经达到7.X了），所以建议在使用Db4o技术建模时，尽量避免引用类型的使用(string类型除外)，特别是一对多关系，尽量用ID代替实际引用。如果不可避免的要用引用类型，要么设置级联删除，要么设置删除事件，要么就干脆使用&ldquo;特性标记&rdquo;使该字段不可被序列化<br /><br /><br />Db4o真的没想象中那么简单。<br /><br />关于Db4o的使用，后续还会有文章介绍<br /><br /><br/>Tags - <a href="http://blog.royee.com/go.php/tags/db4o/" rel="tag">db4o</a> , <a href="http://blog.royee.com/go.php/tags/%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593%25E5%25A4%25A7%25E5%25B0%258F/" rel="tag">数据库大小</a> , <a href="http://blog.royee.com/go.php/tags/%25E4%25B8%25BB%25E9%2594%25AE/" rel="tag">主键</a> , <a href="http://blog.royee.com/go.php/tags/%25E5%25BC%2595%25E7%2594%25A8%25E7%25B1%25BB%25E5%259E%258B/" rel="tag">引用类型</a> , <a href="http://blog.royee.com/go.php/tags/%25E4%25B8%2580%25E5%25AF%25B9%25E5%25A4%259A/" rel="tag">一对多</a>
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/222.htm</link>
<title><![CDATA[C#泛型类的静态构造函数及静态成员]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Fri, 28 Aug 2009 00:51:41 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/222.htm</guid> 
<description>
<![CDATA[ 
	<p>静态构造函数总是至多被调用一次吗？静态构造函数一定会被调用吗？看如下反例：<br /><br />namespace ConsoleApplication1<br />&#123;<br />&nbsp;&nbsp;&nbsp; class Program:A&lt;float&gt;<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static Program()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class Program static construct invoked.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(B.SomeValue++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(C.SomeValue++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(D.SomeValue++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(E.SomeValue++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(E.SomeValue2++);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new F();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new F();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadKey();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp; class A&lt;T&gt;<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static int SomeValue=0;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public A()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class A&lt;&#123;0&#125;&gt; dynamic construct invoked.&quot;, typeof(T).Name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</p><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static A()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class A&lt;&#123;0&#125;&gt; static construct invoked.&quot;,typeof(T).Name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp; class B : A&lt;string&gt;<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static B()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class B static construct invoked.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp; &#125;</p><p><br />&nbsp;&nbsp;&nbsp; class C : A&lt;int&gt;<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static C()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class C static construct invoked.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp; class D : A&lt;int&gt;<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static D()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class D static construct invoked.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp; class E : A&lt;float&gt;<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static int SomeValue2 = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static E()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class E static construct invoked.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp; class F : A&lt;bool&gt;<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public F()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class F dynamic construct invoked.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static F()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Class F static construct invoked.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp; &#125;</p><p>&#125;<br /><br /><br />输出如下：<br />Class Programe static construct invoked.<br />Class A&lt;String&gt; static construct invoked.<br />0<br />Class A&lt;Int32&gt; static construct invoked.<br />0<br />1<br />Class A&lt;Single&gt; static construct invoked.<br />0<br />Class E static construct invoked.<br />0<br />Class F static construct invoked.<br />Class A&lt;Boolean&gt; static construct invoked.<br />Class A&lt;Boolean&gt; dynamic construct invoked.<br />Class F dynamic construct invoked.<br />Class A&lt;Boolean&gt; dynamic construct invoked.<br />Class F dynamic construct invoked.<br /><br />对输出结果分析如下：<br /><br />//程序运行实际上是Framework调用Program的Main静态方法，但不会实例化Program<br />Class Program static construct invoked.&nbsp;&nbsp;<br />//实际上静态成员并不支持继承，C#编译器会在底层将B.SomeValue翻译成A&lt;string&gt;.SomeValue<br />//所以被加载的不是B，而是A&lt;string&gt;<br />Class A&lt;String&gt; static construct invoked.&nbsp;<br />0<br />//同样此处C.SomeValue被翻译成A&lt;int&gt;.SomeValue<br />Class A&lt;Int32&gt; static construct invoked.<br />//诧异？被继承的SomeValue不是被&ldquo;加加&rdquo;了吗，为何此处还是0<br />0<br />//看到了吧，SomeValue确实被&ldquo;加加&rdquo;了，不过A&lt;string&gt;与A&lt;int&gt;属于不同的类型<br />//里面的SomeValue也是相互独立的<br />1<br />//E.SomeValue被翻译成A&lt;float&gt;.SomeValue<br />Class A&lt;Single&gt; static construct invoked.<br />0<br />//此处的E.SomeValue2远远本本的就是E.SomeValue2当然E的静态构造函数会被执行。<br />//现在我们才发觉B/C/D三者的静态构造函数都没被执行，原因呢，刚才也说了，实际上<br />//上面的B/C/D的引用在底层都被翻译成了A的封闭类，所以加载的并不是B/C/D本身，而是<br />//相应的封闭类<br />Class E static construct invoked.<br />0<br />//现在再来温习一下静态构造方法与构造方法的执行顺序<br />//因为new的是F，所以F首先被加载，进而执行F的静态构造<br />Class F static construct invoked.<br />//加载F后发现F是从A&lt;bool&gt;继承的，进而去加载A&lt;bool&gt;，于是A&lt;bool&gt;的静态构造被执行<br />Class A&lt;Boolean&gt; static construct invoked.<br />//首先执行基类的构造方法<br />Class A&lt;Boolean&gt; dynamic construct invoked.<br />//而后是F自己的构造方法<br />Class F dynamic construct invoked.<br />//此两句因为A&lt;bool&gt;与F以被加载，静态构造已被执行，因而直接按顺序从低往高调用构造方法<br />Class A&lt;Boolean&gt; dynamic construct invoked.<br />Class F dynamic construct invoked.<br /><br /><br />总结：<br />1.泛型类的各封闭类，属于不同的类，各自有自己独立的静态空间<br />2.静态成员实际上不支持继承，C#编译器在底层将实际的引用确定成静态成员定义者<br />3.静态构造函数不一定会被执行，因为有的类，在执行过程中不会被加载<br />4.静态构造函数确实是总是至多被调用一次，但是泛型类的静态构造要站在另一个角度考虑<br />5.类的构造函数执行顺序是自底而上<br />6.类的静态构造函数执行顺序是不能确定的，因为编程过程中，类的使用顺序是不定的，静态构造函数总是在类第一次被用到的地方执行</p><br/>Tags - <a href="http://blog.royee.com/go.php/tags/%25E6%25B3%259B%25E5%259E%258B/" rel="tag">泛型</a> , <a href="http://blog.royee.com/go.php/tags/%25E9%259D%2599%25E6%2580%2581%25E6%259E%2584%25E9%2580%25A0/" rel="tag">静态构造</a> , <a href="http://blog.royee.com/go.php/tags/%25E6%259E%2584%25E9%2580%25A0%25E6%2596%25B9%25E6%25B3%2595/" rel="tag">构造方法</a> , <a href="http://blog.royee.com/go.php/tags/%25E6%2589%25A7%25E8%25A1%258C%25E9%25A1%25BA%25E5%25BA%258F/" rel="tag">执行顺序</a>
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/221.htm</link>
<title><![CDATA[DB4O下的ID唯一性问题，及在.NET3.5下的小Bug]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Fri, 14 Aug 2009 14:35:34 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/221.htm</guid> 
<description>
<![CDATA[ 
	<p>看了诸多关于ID问题的讨论后，决定用Guid结合插入时事件来实现ID唯一性。<br /><br />实现如下(.NET3.5的自动属性)：<br /><br />//实体基类<br />public abstract&nbsp;class Entity&#123;<br />&nbsp;&nbsp;&nbsp; public Guid ID&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get;set;<br />&nbsp;&nbsp;&nbsp; &#125;<br />&#125;<br /><br />//汽车<br />public class Car:Entity&#123;<br />&nbsp;&nbsp;&nbsp; public Person Owner&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get;set;<br />&nbsp;&nbsp;&nbsp; &#125;<br />&#125;<br /><br />//人<br />//public class Person:Entity&#123;<br />&nbsp;&nbsp;&nbsp; public string Name&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get;set;<br />&nbsp;&nbsp;&nbsp; &#125;<br />&#125;<br /><br /><br /><br />以下是业务基类：<br />&nbsp;&nbsp;&nbsp; public abstract class BLLBase&lt;T&gt; : ICommonBLL&lt;T&gt; where T : Entity<br />&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //静态ObjectServer对象用以持有数据文件</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected static IObjectServer DBS;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //静态ObjectContainer对象，用于静态代码中的数据操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected static IObjectContainer DBC;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //DB4O的事件注册器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected static IEventRegistry DBER;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //运行时的ObjectContainer实例</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected IObjectContainer DB;<br /></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 静态构造用于打开ObjectServer及注册应用程序结束事件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static BLLBase()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //BLLFactoryBase在BLLBase加载前要准备好ConnectionString<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //此处在实际Factory被加载时会初始化ObjectServer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IConfiguration conf = Db4oFactory.NewConfiguration();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conf.BlockSize(8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conf.ActivationDepth(2);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始化静态ObjectServer/ObjectClient及事件注册器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBS = Db4oFactory.OpenServer(conf, Factory.ConnectionString, 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBC = DBS.OpenClient();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBER = EventRegistryFactory.ForObjectContainer(DBC);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBER.Creating += new CancellableObjectEventHandler(BLLBase_Creating);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //进程结束时关闭ObjectServer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 应用程序结束事件，用于关闭ObjectServer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;sender&quot;&gt;&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;args&quot;&gt;&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void CurrentDomain_ProcessExit(object sender, EventArgs args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBC.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBS.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 数据创建事件，自动生成唯一性标识<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;sender&quot;&gt;&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;args&quot;&gt;&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void BLLBase_Creating(object sender, ObjectEventArgs args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Model.Entity ent = args.Object as Entity;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ent != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ent.ID = Guid.NewGuid();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 构造时打开连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BLLBase()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB = DBS.OpenClient();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 不用时释放连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~BLLBase()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //增删改查的基础实现省略<br />&nbsp;&nbsp;&nbsp; &#125;<br /><br />在进行插入操作时会引发BLLBase_Creating，会给实体对象的ID赋一个唯一的值。<br /><br /><br /><br />但是在实际调试中插入后其他属性都有值，就是ID没有，但调试过程中确实看到Guid.NewGuid()的运行并被赋给ID。但却保存不了，近两个小时的折腾之后，却发现是.NET3.5自动属性搞的鬼。<br /><br />原来DB4O保存的是对当前对象可见的域，而自动属性被编译器翻译后最终会成为如下形式：<br /><br />public class Entity&#123;<br />&nbsp;&nbsp;&nbsp; private Guid _ID;<br />&nbsp;&nbsp;&nbsp; public Guid ID&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get&#123;return _ID;&#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&#123;_ID=value;&#125;<br />&nbsp;&nbsp;&nbsp; &#125;<br />&#125;<br /><br />显然无论是Car还是Person从Entity继承来的_ID对他们来说都是不可见的，所以不会被保存。<br /><br />明白以后就修改Entity的各个属性将私有域改为protected即可<br /></p><br/>Tags - <a href="http://blog.royee.com/go.php/tags/db4o/" rel="tag">db4o</a> , <a href="http://blog.royee.com/go.php/tags/db4objects/" rel="tag">db4objects</a> , <a href="http://blog.royee.com/go.php/tags/guid/" rel="tag">guid</a> , <a href="http://blog.royee.com/go.php/tags/.net3.5/" rel="tag">.net3.5</a> , <a href="http://blog.royee.com/go.php/tags/%25E8%2587%25AA%25E5%258A%25A8%25E5%25B1%259E%25E6%2580%25A7/" rel="tag">自动属性</a>
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/220.htm</link>
<title><![CDATA[母版与子页面事件顺序，及如何设计DataBind]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ASP与.NET]]></category>
<pubDate>Thu, 06 Aug 2009 00:47:16 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/220.htm</guid> 
<description>
<![CDATA[ 
	<p><span style="color: red">母版页和内容页的执行顺序：</span></p><p><span style="color: red">1.母版页中控件的Init;</span><br /><span style="color: red">2.内容页控件的Init;</span><br /><span style="color: red">3.母版页的Init;</span><br /><span style="color: red">4.内容页的Init;</span><br /><span style="color: red">5.内容页的Load;</span><br /><span style="color: red">6.母版页的Load;</span><br /><span style="color: red">7.内容页中控件的Load;</span><br /><span style="color: red">8.内容页的PreRender;</span><br /><span style="color: red">9.母版页的PreRender;</span><br /><span style="color: red">10.母版页控件的PreRender;</span><br /><span style="color: red">11.内容页中控件的PreRender<br /><br /><br />另：Page.DataBind()会引发子控件的DataBind()，母版页的Page.DataBind()会引发子页面的DataBind()<br /><br /><br />DataBind可做以下设计（按执行顺序书写）：<br /><br /><br />母版页Init:&nbsp; 读取系统配置，设定母版空间DataSource 等<br />子页面Load: 设定子页面空间DataSource<br />模板页Load: 执行Page.DataBind();</span></p>
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/219.htm</link>
<title><![CDATA[Ubuntu Server下无线上网]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Sun, 12 Jul 2009 10:59:31 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/219.htm</guid> 
<description>
<![CDATA[ 
	<p>安装好网卡后，安装 (最新版Ubuntu Server 9.04已集成wpasupplicant) </p><p>apt-get install wpasupplicant <br /><br />生成配置文件：<br />wpa_passphrase SSID KEY &gt; /etc/wpa_supplicant.conf<br /><br />修改/etc/network/interfaces：<br />auto wlan0<br />iface wlan0 inet dhcp<br />wpa-conf /etc/wpa_supplicant.conf <br /><br /><br />（/etc/wpa_supplicant.conf 这个位置可以随便定）</p>
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/218.htm</link>
<title><![CDATA[回家了，等待正式工作]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[美好心情]]></category>
<pubDate>Sun, 05 Jul 2009 05:11:03 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/218.htm</guid> 
<description>
<![CDATA[ 
	家里接了光纤，速度巨快，终于不用忍受学校的烂网络了。可惜在家待不长，又要去工作。
]]>
</description>
</item><item>
<link>http://blog.royee.com/read.php/203.htm</link>
<title><![CDATA[修复注册表清理后IE中图片不能正确显示]]></title> 
<author>如易小鱼 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Sat, 11 Apr 2009 06:01:54 +0000</pubDate> 
<guid>http://blog.royee.com/read.php/203.htm</guid> 
<description>
<![CDATA[ 
	系统装的是Windows2003，上次因为老大发了个木马给我测试，把IE搞坏了，于是用360等工具清理了注册表，然后IE里面的图片就显示不了了，特别是PNG格式。 <br /><br /><br />后来在网上找到了修复的方法，才知道是注册表修复工具清除了系统的MIME信息导致的这种问题，下面是修复MIME信息用的注册表文件： <br /><br /><a href="attachment.php?fid=1">点击这里下载文件</a><br/>Tags - <a href="http://blog.royee.com/go.php/tags/png/" rel="tag">png</a> , <a href="http://blog.royee.com/go.php/tags/ie/" rel="tag">ie</a> , <a href="http://blog.royee.com/go.php/tags/mime/" rel="tag">mime</a> , <a href="http://blog.royee.com/go.php/tags/%25E6%25B3%25A8%25E5%2586%258C%25E8%25A1%25A8/" rel="tag">注册表</a>
]]>
</description>
</item>
</channel>
</rss>