﻿<?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>博客园-维生素C.net</title><link>http://www.cnblogs.com/fanweixiao/</link><description>IronRuby, CLR/DLR, Debugging</description><language>zh-cn</language><lastBuildDate>Fri, 29 Aug 2008 01:21:31 GMT</lastBuildDate><pubDate>Fri, 29 Aug 2008 01:21:31 GMT</pubDate><ttl>60</ttl><item><title>写程序!=表现自己的无知 从一个可移植的C程序说起</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/08/14/1267475.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Wed, 13 Aug 2008 17:00:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/08/14/1267475.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1267475.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/08/14/1267475.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1267475.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1267475.html</trackback:ping><description><![CDATA[<p>在年初的时候做了一个很小的支持故障转移的简陋的缓存，是用c在ubuntu上实现的，后来希望这个c程序有非常好的移植性，就把c的说明文档大体看了一下，才发现了好多学习c时的误区。</p>
<p>想起前两天跟同学校的几位同学聊起几个技术相关的问题，最大的感觉就是大家都越来越忽视程序了，眼高手低和粗心大意其实不是&#8220;失误&#8221;或&#8220;毛病&#8221;，而是&#8220;很严重的错误&#8221;。</p>
<p>每次遇到说java要不.net好的人，我向来第一感觉都是挺佩服的——能把这两个东东看到很透彻的人水平绝对不差，肯定是我老师级别的，我可以像他学不少东西的——可是几乎每次结果都是让我以&#8220;sorry，有点事，离开一下&#8221;来中止这段谈话。更有一个我的朋友说&#8220;技术牛不牛无所谓，知道大体怎么回事，业务熟就行了&#8221;。中国软件业为何差？这样的意识形态绝对不是一两个人生而有之的。</p>
<p>言归正传，我这位同学的宣称&#8220;可移植&#8221;的c中有几句是这样的：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_010037" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_010037').style.display='none'; document.getElementById('Code_Open_Image_010037').style.display='inline'; document.getElementById('Code_Open_Text_010037').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_010037" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_010037').style.display='none'; getElementById('Code_Closed_Image_010037').style.display='inline'; getElementById('Code_Closed_Text_010037').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_010037">Code</span><span id="Code_Open_Text_010037" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a;<br />
</span><span style="color: #0000ff">while</span><span style="color: #000000">((a</span><span style="color: #000000">=</span><span style="color: #000000">getchar())</span><span style="color: #000000">!=</span><span style="color: #000000">EOF)<br />
&nbsp;&nbsp;&nbsp; putchar(tolower(a)));</span></span></div>
<p>&nbsp;</p>
<p>打眼一看，这是一段把用户输入转换成小写的功能。可是这三行代码能&#8220;任意移植&#8221;吗？</p>
<p>答案肯定是不能——tolower()和toupper()在早期的c里是被实现为宏的。这个宏是个有利有弊的问题，尤其是在不同版本的c里，宏的使用都是个老大难的问题。比如说tolower()，他的实现如果是：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_010140" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_010140').style.display='none'; document.getElementById('Code_Open_Image_010140').style.display='inline'; document.getElementById('Code_Open_Text_010140').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_010140" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_010140').style.display='none'; getElementById('Code_Closed_Image_010140').style.display='inline'; getElementById('Code_Closed_Text_010140').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_010140">Code</span><span id="Code_Open_Text_010140" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;tolower(c)&nbsp;((c)+'A'-'a')</span></span></div>
<p>&nbsp;</p>
<p>那就糟糕了，上面的程序如果输入的就是小写，那得到的就是垃圾数据了。</p>
<p>冰山一角，我问了那位同学是否知道a+=b在有的c实现里也可以写成a=+b啊，得到的答案是沉默。我又问了一个知道a=/ *b和a=/*b有什么区别吗？答案还是沉默。</p>
<p>写程序，切忌在喧闹的酒吧里写——浮躁的环境和时代附加给代码的只可能是你的无知。So，如果你认为你是一个程序员，请尊重你的职业。</p>
<img src ="http://www.cnblogs.com/fanweixiao/aggbug/1267475.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41947/" target="_blank">[新闻]施密特：谷歌计划十月份开始推进与雅虎合作</a>]]></description></item><item><title>在windbg时要注意sos.dll的版本</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/08/06/1261577.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Tue, 05 Aug 2008 17:37:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/08/06/1261577.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1261577.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/08/06/1261577.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1261577.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1261577.html</trackback:ping><description><![CDATA[<p>前段时间项目遇到一些问题，抓了一个dump后拿回家里的机器上分析。按着方法一步一步走，走到!clrstack的时候，问题出现了——看不到托管环境下的method name。我觉得这这!clrstack看不到method name可真没什么作用了。随后请教了几个朋友，都说没碰到过着情况。</p>
<p>第二天去了公司先打开windbg，open这个dump，载入sos后先来一个~*e!clrstack。邪门，method name都出来了。</p>
<p>从操作系统，windbg版本，symbols等几个方面都下手分析了一下，未果。问人吧，问了一圈都没有解决。问了熊力大哥，他说他可以看到，说明问题肯定不奇怪，而且肯定是某个细节的问题。挂虚拟机，测之，问题依旧，大悦，终于出问题了。</p>
<p>后来我把我公司机器上的sos和家里机器的sos拿过来比较，大小不一样，用!eeversion来看，版本号确实不一样。问题解决——选用合适的版本！</p>
<p>&nbsp;</p>
<p>--the not work one--<br />
0:000&gt; .load c:\windows\microsoft.net\framework\v2.0.50727\sos.dll<br />
0:000&gt; !eeversion<br />
2.0.50727.1433 retail<br />
Workstation mode<br />
SOS Version: 2.0.50727.<strong><em style="color: red">3031</em></strong> retail build</p>
<p>&nbsp;</p>
<p>--the work one--<br />
0:000&gt; .load ../sos.dll<br />
0:000&gt; !eeversion<br />
2.0.50727.1433 retail<br />
Workstation mode<br />
SOS Version: 2.0.50727.<strong><em style="color: red">1433</em></strong> retail build</p>
<p>&nbsp;</p>
<p>--not work one result--<br />
0:000&gt; ~*e!clrstack<br />
OS Thread Id: 0x11cc (0)<br />
ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br />
0012f440 7c9585ec [NDirectMethodFrameStandalone: 0012f440] <br />
0012f450 67a241d2 <br />
0012f47c 00c100a7 <br />
0012f69c 79e7c74b [GCFrame: 0012f69c] <br />
OS Thread Id: 0x139c (1)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0x994 (2)<br />
Failed to start stack walk: 80004005<br />
OS Thread Id: 0xaec (3)<br />
Failed to start stack walk: 80004005<br />
OS Thread Id: 0xc14 (4)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0x9bc (5)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0xe3c (6)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0x11b0 (7)<br />
ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br />
<span style="color: red">0421f654 7c9585ec [HelperMethodFrame: 0421f654] </span><br />
0421f6a8 00c13f48 <br />
0421f6c4 7964a312 <br />
0421f6cc 79373ecd <br />
0421f6e4 7940647a <br />
0421f90c 79e7c74b [GCFrame: 0421f90c] </p>
<p>&nbsp;</p>
<p>--work one result--<br />
0:000&gt; ~*e!clrstack<br />
OS Thread Id: 0x11cc (0)<br />
ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br />
0012f440 7c9585ec [NDirectMethodFrameStandalone: 0012f440] System.ServiceProcess.NativeMethods.StartServiceCtrlDispatcher(IntPtr)<br />
0012f450 67a241d2 System.ServiceProcess.ServiceBase.Run(System.ServiceProcess.ServiceBase[])<br />
0012f47c 00c100a7 CSDN.IM.JobTimeWindowsServices.Program.Main()<br />
0012f69c 79e7c74b [GCFrame: 0012f69c] <br />
OS Thread Id: 0x139c (1)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0x994 (2)<br />
Failed to start stack walk: 80004005<br />
OS Thread Id: 0xaec (3)<br />
Failed to start stack walk: 80004005<br />
OS Thread Id: 0xc14 (4)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0x9bc (5)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0xe3c (6)<br />
Unable to walk the managed stack. The current thread is likely not a <br />
managed thread. You can run !threads to get a list of managed threads in<br />
the process<br />
OS Thread Id: 0x11b0 (7)<br />
ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIP&nbsp;&nbsp;&nbsp;&nbsp; <br />
<span style="color: red">0421f654 7c9585ec [HelperMethodFrame: 0421f654] System.Threading.Thread.SleepInternal(Int32)</span><br />
0421f6a8 00c13f48 Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Storage.ConfigurationChangeWatcher.Poller(System.Object)<br />
0421f6c4 7964a312 System.Threading.ThreadHelper.ThreadStart_Context(System.Object)<br />
0421f6cc 79373ecd System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)<br />
0421f6e4 7940647a System.Threading.ThreadHelper.ThreadStart(System.Object)<br />
0421f90c 79e7c74b [GCFrame: 0421f90c] </p>
<p>&nbsp;</p>
<p>remember: <strong>选用匹配的版本</strong></p>
<p><strong></strong>&nbsp;</p>
<p>-----------</p>
<p>后来为了弄清楚问题,发邮件问了Tom,他给给的回复是：</p>
<p><em>So the problem here is that we do not guarantee that newer versions of SOS will be able to debug older versions of CLR.&nbsp; You must match the version of SOS to the version of the runtime (unless we are explicitly giving them private bits for SOS to fix a bug in it).&nbsp; From the output below, !eeversion is telling you that the one that won&#8217;t walk the stack does not match the runtime&#8217;s version.&nbsp; This is why it won&#8217;t walk the stack.<br />
We always try to make SOS backwards compatible, but it&#8217;s not something we guarantee.</em>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/fanweixiao/aggbug/1261577.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41946/" target="_blank">[新闻]微软加快XP专业版反盗版步伐</a>]]></description></item><item><title>从SQL Server里导出存储过程和用户自定义函数</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/08/03/1259277.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Sun, 03 Aug 2008 08:12:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/08/03/1259277.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1259277.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/08/03/1259277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1259277.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1259277.html</trackback:ping><description><![CDATA[<p><em>exec master..xp_cmdshell <br />
'bcp "Select routine_definition from <strong style="color: #ff0000">OnlyVC</strong>.information_Schema.routines order by routine_name" queryout "d:\1.sql" -c<strong> <span style="color: #ff0000">&#8211;T</span></strong>' </em></p>
<p>加粗部分为db的name</p>
<p>执行前要注意2个地方:
<p><strong>1.先执行</strong>
<p><em>EXEC sp_configure 'show advanced options', 1 <br />
RECONFIGURE WITH OVERRIDE <br />
EXEC sp_configure 'xp_cmdshell', 1 <br />
RECONFIGURE WITH OVERRIDE <br />
EXEC sp_configure&nbsp; 'show advanced options', 0</em> </p>
<p>否则会遇到下面的错误:</p>
<p><span style="color: #ff0000">Msg 15281, Level 16, State 1, Procedure xp_cmdshell, Line 1<br />
SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online. </span>
<p><strong>2.添加-T参数:</strong>
<p>否则会遇到下面的错误:
<p><a href="http://www.cnblogs.com/images/cnblogs_com/fanweixiao/WindowsLiveWriter/SQLServer_E3D8/err1_2.png"><img title="err1" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="100" alt="err1" src="http://www.cnblogs.com/images/cnblogs_com/fanweixiao/WindowsLiveWriter/SQLServer_E3D8/err1_thumb.png" width="514" border="0" /></a>
<p><span style="color: #ff0000">User name not provided, either use -U to provide the user name or use -T for Trusted Connection</span> </p>
<img src ="http://www.cnblogs.com/fanweixiao/aggbug/1259277.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41945/" target="_blank">[新闻]Mozilla与谷歌续签三年搜索合同</a>]]></description></item><item><title>1.让IronRuby运行起来</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/07/29/1255185.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Mon, 28 Jul 2008 18:32:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/07/29/1255185.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1255185.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/07/29/1255185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1255185.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1255185.html</trackback:ping><description><![CDATA[<p>编译源代码运行方式:</p>
<p>1.<tt>svn://rubyforge.org/var/svn/ironruby</tt><br />
<img height="280" alt="IronRuby Get" src="http://www.codethinked.com/image.axd?picture=WindowsLiveWriter/GettingIronRubyUpandRunning_F254/image_c347e7cf-95c7-4d9e-86ce-ed8883786c83.png" width="406" border="0" /><br />
<br />
<img height="194" alt="IronRuby Get Done" src="http://www.codethinked.com/image.axd?picture=WindowsLiveWriter/GettingIronRubyUpandRunning_F254/image_94688cc1-e7a7-4eb9-a5ca-4f45cda4cac6.png" width="421" border="0" /></p>
<p>2.打开\IronRuby\IronRuby.sln,需要注意的是Load Prj normally<br />
<img height="312" alt="Security Warning" src="http://www.codethinked.com/image.axd?picture=WindowsLiveWriter/GettingIronRubyUpandRunning_F254/image_586442e5-65c1-4dd1-a86b-1122d88c04c7.png" width="408" border="0" /><br />
然后编译整个项目</p>
<p>3.打开Visual Studio xx Command Prompt(run as administrator),到\IronRuby\(如果是debug模式编译的话)下执行runfirst.cmd</p>
<p>4.方便期间,在系统环境变量里添加<a href="http://www.cnblogs.com/fanweixiao/admin/file://build/Debug/">\IronRuby\Build\Debug\</a>(如果是以debug方式编译)的path. 新开一个cmd窗口.输入ir,通常情况下可以看到:<br />
<img height="105" alt="image" src="http://www.codethinked.com/image.axd?picture=WindowsLiveWriter/GettingIronRubyUpandRunning_F254/image_f5036207-f667-4c9e-81e4-85b229105ef8.png" width="553" border="0" /></p>
<p>OK,IronRuby运行起来了</p>
<p>----------- </p>
<p>做一个简单的测试:</p>
<p>1.用notepad新建一个Hi.rb,内容如下:<br />
<em><strong>class Hi</strong></em> <span style="color: #339966">#类的名称与Hi.rb的主文件名要一致,后面需要<br />
</span><em><strong>&nbsp;&nbsp; def say<br />
&nbsp;&nbsp;&nbsp;&nbsp; puts &#8220;hi, fanweixiao&#8221;<br />
&nbsp;&nbsp; end<br />
end</strong></em></p>
<p>2.再创建一个test.rb,内容:<br />
<em><strong>require &#8220;Hi&#8221;</strong></em> <span style="color: #339966">#会自动寻找Hi.rb文件<br />
<br />
</span><em><strong>h=Hi.new<br />
h.say</strong></em></p>
<p>3.运行ir test.rb. 能看到结果了.</p>
<p>&nbsp;</p>
<p>如果不清楚可以查看<a href="http://www.codethinked.com/post/2008/07/17/Running-Applications-in-IronRuby.aspx" target="_blank">更为详细的原文</a></p>
<img src ="http://www.cnblogs.com/fanweixiao/aggbug/1255185.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41944/" target="_blank">[新闻]CBS推出新版CNET重推视频</a>]]></description></item><item><title>启用subversion服务</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/07/28/1254233.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Sun, 27 Jul 2008 18:12:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/07/28/1254233.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1254233.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/07/28/1254233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1254233.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1254233.html</trackback:ping><description><![CDATA[<p>D:\Software\svn15\bin&gt;sc create svnservice12 binpath= "D:\Software\svn15\bin\svnserve.exe --service -r D:\Svn_reposities" displayname= "SubversionRepository3" depend= Tcpip start= auto</p> <p>在网上google了好几个,有的写法错了,有的是用-d(deamon守护模式)来启动的. 这里记录一个正确的.</p>   <img src ="http://www.cnblogs.com/fanweixiao/aggbug/1254233.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41943/" target="_blank">[新闻]轮回－新浪推出Facebook模式的SNS</a>]]></description></item><item><title>在windows server 2008上配置Virtual Server 2005 (SP1)</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/07/27/1252311.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Sat, 26 Jul 2008 19:49:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/07/27/1252311.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1252311.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/07/27/1252311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1252311.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1252311.html</trackback:ping><description><![CDATA[<p>情景1:<br>安装完后访问,报<strong><em>Could not connect to Virtual Server.&nbsp; Access Denied.&nbsp; Please contact Virtual Server administrator to set the required permissions to manage Virtual Server.&nbsp; You can specify an alternate Virtual Server below.</em></strong>的错误<br>原因:<br>IIS7中需要安装windows authentication</p> <p>情景2:<br>安装完后访问,提示下载exe文件,而不是在浏览器里展示<br>IIS7中需要安装CGI支持</p> <p>关键步骤:</p> <ol> <li>安装iis7,至少包含windows authentication和CGI</li> <li>在virtual server的site下配置Authentication,disable除windows authentication外的其他验证方式</li> <li>在Handler Mapping下启用CGI-exe,确保excute权限.</li></ol> <p>没有x64,没有Hyper-V,痛苦.</p>   <img src ="http://www.cnblogs.com/fanweixiao/aggbug/1252311.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41940/" target="_blank">[新闻]惠普139亿美元完成对EDS的收购</a>]]></description></item><item><title>与GC相关的性能计数器</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/07/22/1248642.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Tue, 22 Jul 2008 05:17:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/07/22/1248642.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1248642.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/07/22/1248642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1248642.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1248642.html</trackback:ping><description><![CDATA[<p>如果遇到了性能问题,在使用debug之前分析问题较为不错的一个工具就是perfmon.解决问题最好的方法是思考,这也是熊力大哥在其书中一直在强调的.</p> <p>如果您的网站遇到下面的几种情形,那还是先看看perfmon里GC相关的东西吧:</p> <ol> <li>cpu占用高,内存占用不高.</li> <li>cpu和内存占用都比较高</li> <li>cpu和内存占用都不高,但是网站响应很慢</li></ol> <p>打开perfmon找到.NET CLR Memory后下面有好几个counter,从哪个开始看呢?</p> <p><strong>1) % Time in GC</strong></p> <p>这个值是说从上一次GC结束到当前这次GC的时间的百分比. 比如上次GC结束时经历了100w个循环,当前的GC消耗是50w个循环,这个计数器的值就是50%. 看perfmon的各个counter来推测究竟是什么问题,主要有两类情况,第一类需要看counter到变化趋势,第二类需要看到是counter到值.这里对待第2类情况引入一个"健康值"的概念.当然这些只是大方向上来说到,并不是100%到准确的适应大多数情况.</p> <p>那么这个值为多少合适呢? 一般来说如果这个值&gt;50%了我们应该去检查一下托管堆的问题.如果这个值不大,没有太大的必要去优化程序了.</p> <p><strong>2)Allocated Bytes/sec</strong></p> <p>如果认为在GC上花费的时间太多了,接下来应该看看Allocated Bytes/sec这个counter,它显示了分配速率.需要注意到是这个counter到值在分配速率很低的情况下其实是不准确的,这个值只有在每次GC开始的时候才会被更新,如果perfmon到取样频率（默认是1秒）大于GC的频率的时候，这个值就不太容易说明问题了。</p> <p>当有分配请求不能被完成时，会触发GC：</p> <ol> <li>Gen0满了，不能满足最后一次的小对象的分配请求</li> <li>LOH满了，不能满足最后一次的大对象分配请求</li></ol> <p>所以当GC开始的时候会更新该计数器到值——将Gen0和LOH想加的和加到这个值上，然后与上一次的值相加再除以时间间隔。得到的就是这个分配速率。</p> <p>举个例子：默认情况下perfmon1秒更新一次数据，在第1秒Gen0 GC因为需要分配100k而触发，所以再第1秒末这个值是(100k-0k)/1sec，是100k/sec。在第2秒没有GC发生，记录的值还是100k，那么第2秒末该值就是(100k-100k)/1sec,是0k/sec，第3秒Gen0 GC又被触发总共被分配了200k，所以在第3秒末的时候这个值是(200k-100k)/1sec，是100k/sec。</p> <p>从上面到例子能看到如果说GC发生的不是非常频繁的话这个值应该是0k/sec的。</p> <p><strong>3)Large Object Heap Size</strong></p> <p>这个值只是记录在LOH里的bytes。</p> <p>OK。到这一步为主，我们可以看出导致GC做大量工作的一个关键因素就是较高的分配速率。大家都知道GC是分Generation的，从Gen0到Gen2，如果一个对象在Gen0到时候就死了，我们况且成它为“夭折”（die young），另一类生命力看似顽强但是到了Gen2立刻挂掉的，我们称之为“中年危机”（die at Gen2）。</p> <p>所以如果都在GC Gen0完成后就结束工作了，花在GC上的时间百分比是不会高的。毕竟Gen0到GC只会占用非常短暂的时间。</p> <p>但是Gen2的GC就不这样了，它会从Gen0到Gen2，再加上LOH的。LOH的GC也是很消耗资源的工作，但是并没有只针对LO的回收，所以即使LOH还有空间可供分配，但是Gen2满了，也会导致LOH跟着一起遭殃。</p> <p>通常来说这三个代的GC速率在100：10：1是不错的。</p> <p><strong>4)# Gen X Collections</strong></p> <p>X到值为0，1和2。需要注意的一点是Gen1会一次性的回收Gen0和Gen1。</p> <p>如果有大量的Gen2上的GC，就意味着有大量的对象存活了太长时间，但是还没长到他们要一直在Gen2里生存。如果看到了GC消耗了很多时间但是分配速率却不高的话，最大的可能就是很多对象在不断的从Gen0到Gen2被不断的提升。</p> <p><strong>5)Promoted Memory from Gen 0/1和 Promoted Finalization - Memory from Gen 0</strong></p> <p>这三个值是看提升（promotion）情况的。被finalization引发的对象的提升要看后者，是不包括在前面两个counter里的。但是后者虽然说是from Gen 0的，但是其实同时包含了Gen0和Gen1的。</p> <p>这时可能出现一种最坏的情况：一个对象存活了很久，最终被提升到Gen2，但是一进入Gen2立刻就死掉了，也就是上述的“中年危机”。当遇到这个情况Promoted Memory from Gen1到只是比较高的，而且有大量的Gen2 GC。</p> <p>需要注意到是当一个finalizable的对象存活时，所以他引用的对象也都是存活的，Promoted Finalization-Memory from Gen0的计数器也包含了这些对象。</p> <p><strong>6)Gen 1/2 heap size</strong></p> <p>当看到这些提升相关的计数器的值比较高时，应该看看这两个counter。他们的意思从名字就能看出。</p> <p>需要注意Gen 0 heap size到值是假的，它其实是一个预算，指示下一次什么时候进行GC的。</p> <p>Gen0和Gen1都很小，从256k到几兆。</p> <p><strong>7)# Total committed Bytes和# Total reserved Bytes</strong></p> <p># Total committed Bytes= Gen0 heap size + Gen 1 heap size + Gen 2 heap size + LOH size</p> <p>后者到值要比前者的值大.</p> <p><strong>8)# Induce GC</strong></p> <p>如果看到这个值比较高那就比较惨了,检查代码中GC.Collect()是不是调用了太多了.这种使用和设置IIS检测到memory涨到一定程度自动回收一样,都不是真正解决问题的方法.</p> <p>&nbsp;</p> <p>参考:<br><a title="http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx" href="http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx">http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx</a><br><a title="http://msdn.microsoft.com/en-us/library/f144e03t(VS.80).aspx" href="http://msdn.microsoft.com/en-us/library/f144e03t(VS.80).aspx">http://msdn.microsoft.com/en-us/library/f144e03t(VS.80).aspx</a><br><a href="http://blogs.msdn.com/maoni">http://blogs.msdn.com/maoni</a><br><a title="http://msdn.microsoft.com/en-us/library/bb802825.aspx" href="http://msdn.microsoft.com/en-us/library/bb802825.aspx">http://msdn.microsoft.com/en-us/library/bb802825.aspx</a></p><img src ="http://www.cnblogs.com/fanweixiao/aggbug/1248642.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41939/" target="_blank">[新闻]搜狗五笔输入法发布</a>]]></description></item><item><title>给系统减肥</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/07/22/1248290.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Mon, 21 Jul 2008 17:30:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/07/22/1248290.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1248290.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/07/22/1248290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1248290.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1248290.html</trackback:ping><description><![CDATA[dd if=/dev/zero of=/empty_file; rm empty_file<img src ="http://www.cnblogs.com/fanweixiao/aggbug/1248290.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41939/" target="_blank">[新闻]搜狗五笔输入法发布</a>]]></description></item><item><title>[code]创建DynamicAssembly</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/07/20/1247238.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Sun, 20 Jul 2008 15:14:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/07/20/1247238.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1247238.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/07/20/1247238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1247238.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1247238.html</trackback:ping><description><![CDATA[<p></p> <div class="code"><font color="black">AssemblyName</font><font color="#808080">&nbsp;</font><font color="black">aName</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="blue">new</font><font color="#808080">&nbsp;</font><font color="black">AssemblyName(</font><font color="#808080">"DynamicAssemblyExample"</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">AssemblyBuilder</font><font color="#808080">&nbsp;</font><font color="black">ab</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="#2b91af">AppDomain</font><font color="black">.CurrentDomain.DefineDynamicAssembly(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">aName,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">AssemblyBuilderAccess.RunAndSave)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// For a single-module assembly, the module name is usually<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// the assembly name plus an extension.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ModuleBuilder</font><font color="#808080">&nbsp;</font><font color="black">mb</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">ab.DefineDynamicModule(aName.Name,</font><font color="#808080">&nbsp;</font><font color="black">aName.Name</font><font color="#808080">&nbsp;</font><font color="black">+</font><font color="#808080"> ".dll"</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">TypeBuilder</font><font color="#808080">&nbsp;</font><font color="black">tb</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">mb.DefineType(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MyDynamicType"</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">TypeAttributes.Public)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Add a private field of type int (Int32).<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">FieldBuilder</font><font color="#808080">&nbsp;</font><font color="black">fbNumber</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.DefineField(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "m_number"</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">typeof</font><font color="black">(</font><font color="blue">int</font><font color="black">),</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">FieldAttributes.Private)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Define a constructor that takes an integer argument and <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// stores it in the private field. <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Type</font><font color="black">[]</font><font color="#808080">&nbsp;</font><font color="black">parameterTypes</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">{</font><font color="#808080">&nbsp;</font><font color="blue">typeof</font><font color="black">(</font><font color="blue">int</font><font color="black">)</font><font color="#808080">&nbsp;</font><font color="black">}</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ConstructorBuilder</font><font color="#808080">&nbsp;</font><font color="black">ctor1</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.DefineConstructor(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodAttributes.Public,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">CallingConventions.Standard,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">parameterTypes)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ILGenerator</font><font color="#808080">&nbsp;</font><font color="black">ctor1IL</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">ctor1.GetILGenerator()</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// For a constructor, argument zero is a reference to the new<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// instance. Push it on the stack before calling the base<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// class constructor. Specify the default constructor of the <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// base class (System.Object) by passing an empty array of <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// types (Type.EmptyTypes) to GetConstructor.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor1IL.Emit(OpCodes.Ldarg_0)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor1IL.Emit(OpCodes.Call,</font><font color="#808080">&nbsp;</font><font color="blue">typeof</font><font color="black">(</font><font color="blue">object</font><font color="black">).GetConstructor(</font><font color="#2b91af">Type</font><font color="black">.EmptyTypes))</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Push the instance on the stack before pushing the argument<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// that is to be assigned to the private field m_number.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor1IL.Emit(OpCodes.Ldarg_0)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor1IL.Emit(OpCodes.Ldarg_1)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor1IL.Emit(OpCodes.Stfld,</font><font color="#808080">&nbsp;</font><font color="black">fbNumber)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor1IL.Emit(OpCodes.Ret)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Define a default constructor that supplies a default value<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// for the private field. For parameter types, pass the empty<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// array of types or pass null.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ConstructorBuilder</font><font color="#808080">&nbsp;</font><font color="black">ctor0</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.DefineConstructor(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodAttributes.Public,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">CallingConventions.Standard,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Type</font><font color="black">.EmptyTypes)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ILGenerator</font><font color="#808080">&nbsp;</font><font color="black">ctor0IL</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">ctor0.GetILGenerator()</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// For a constructor, argument zero is a reference to the new<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// instance. Push it on the stack before pushing the default<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// value on the stack, then call constructor ctor1.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor0IL.Emit(OpCodes.Ldarg_0)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor0IL.Emit(OpCodes.Ldc_I4_S,</font><font color="#808080">&nbsp;</font><font color="maroon">42</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor0IL.Emit(OpCodes.Call,</font><font color="#808080">&nbsp;</font><font color="black">ctor1)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ctor0IL.Emit(OpCodes.Ret)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Define a property named Number that gets and sets the private <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// field.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">//<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// The last argument of DefineProperty is null, because the<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// property has no parameters. (If you don't specify null, you must<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// specify an array of Type objects. For a parameterless property,<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// use the built-in array with no elements: Type.EmptyTypes)<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">PropertyBuilder</font><font color="#808080">&nbsp;</font><font color="black">pbNumber</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.DefineProperty(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Number"</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">PropertyAttributes.HasDefault,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">typeof</font><font color="black">(</font><font color="blue">int</font><font color="black">),</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">null</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// The property "set" and property "get" methods require a special<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// set of attributes.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodAttributes</font><font color="#808080">&nbsp;</font><font color="black">getSetAttr</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">MethodAttributes.Public</font><font color="#808080">&nbsp;</font><font color="black">|</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodAttributes.SpecialName</font><font color="#808080">&nbsp;</font><font color="black">|</font><font color="#808080">&nbsp;</font><font color="black">MethodAttributes.HideBySig</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Define the "get" accessor method for Number. The method returns<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// an integer and has no arguments. (Note that null could be <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// used instead of Types.EmptyTypes)<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodBuilder</font><font color="#808080">&nbsp;</font><font color="black">mbNumberGetAccessor</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.DefineMethod(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "get_Number"</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">getSetAttr,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">typeof</font><font color="black">(</font><font color="blue">int</font><font color="black">),</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Type</font><font color="black">.EmptyTypes)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ILGenerator</font><font color="#808080">&nbsp;</font><font color="black">numberGetIL</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">mbNumberGetAccessor.GetILGenerator()</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// For an instance property, argument zero is the instance. Load the <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// instance, then load the private field and return, leaving the<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// field value on the stack.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">numberGetIL.Emit(OpCodes.Ldarg_0)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">numberGetIL.Emit(OpCodes.Ldfld,</font><font color="#808080">&nbsp;</font><font color="black">fbNumber)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">numberGetIL.Emit(OpCodes.Ret)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Define the "set" accessor method for Number, which has no return<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// type and takes one argument of type int (Int32).<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodBuilder</font><font color="#808080">&nbsp;</font><font color="black">mbNumberSetAccessor</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.DefineMethod(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "set_Number"</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">getSetAttr,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">null</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">new</font><font color="#808080">&nbsp;</font><font color="#2b91af">Type</font><font color="black">[]</font><font color="#808080">&nbsp;</font><font color="black">{</font><font color="#808080">&nbsp;</font><font color="blue">typeof</font><font color="black">(</font><font color="blue">int</font><font color="black">)</font><font color="#808080">&nbsp;</font><font color="black">})</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ILGenerator</font><font color="#808080">&nbsp;</font><font color="black">numberSetIL</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">mbNumberSetAccessor.GetILGenerator()</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Load the instance and then the numeric argument, then store the<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// argument in the field.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">numberSetIL.Emit(OpCodes.Ldarg_0)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">numberSetIL.Emit(OpCodes.Ldarg_1)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">numberSetIL.Emit(OpCodes.Stfld,</font><font color="#808080">&nbsp;</font><font color="black">fbNumber)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">numberSetIL.Emit(OpCodes.Ret)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Last, map the "get" and "set" accessor methods to the <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// PropertyBuilder. The property is now complete. <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">pbNumber.SetGetMethod(mbNumberGetAccessor)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">pbNumber.SetSetMethod(mbNumberSetAccessor)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Define a method that accepts an integer argument and returns<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// the product of that integer and the private field m_number. This<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// time, the array of parameter types is created on the fly.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodBuilder</font><font color="#808080">&nbsp;</font><font color="black">meth</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.DefineMethod(</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MyMethod"</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodAttributes.Public,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">typeof</font><font color="black">(</font><font color="blue">int</font><font color="black">),</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">new</font><font color="#808080">&nbsp;</font><font color="#2b91af">Type</font><font color="black">[]</font><font color="#808080">&nbsp;</font><font color="black">{</font><font color="#808080">&nbsp;</font><font color="blue">typeof</font><font color="black">(</font><font color="blue">int</font><font color="black">)</font><font color="#808080">&nbsp;</font><font color="black">})</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ILGenerator</font><font color="#808080">&nbsp;</font><font color="black">methIL</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">meth.GetILGenerator()</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// To retrieve the private instance field, load the instance it<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// belongs to (argument zero). After loading the field, load the <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// argument one and then multiply. Return from the method with <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// the return value (the product of the two numbers) on the <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// execution stack.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">methIL.Emit(OpCodes.Ldarg_0)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">methIL.Emit(OpCodes.Ldfld,</font><font color="#808080">&nbsp;</font><font color="black">fbNumber)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">methIL.Emit(OpCodes.Ldarg_1)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">methIL.Emit(OpCodes.Mul)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">methIL.Emit(OpCodes.Ret)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Finish the type.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Type</font><font color="#808080">&nbsp;</font><font color="black">t</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">tb.CreateType()</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// The following line saves the single-module assembly. This<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// requires AssemblyBuilderAccess to include Save. You can now<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// type "ildasm MyDynamicAsm.dll" at the command prompt, and <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// examine the assembly. You can also write a program that has<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// a reference to the assembly, and use the MyDynamicType type.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">ab.Save(aName.Name</font><font color="#808080">&nbsp;</font><font color="black">+</font><font color="#808080"> ".dll"</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Because AssemblyBuilderAccess includes Run, the code can be<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// executed immediately. Start by getting reflection objects for<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// the method and the property.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">MethodInfo</font><font color="#808080">&nbsp;</font><font color="black">mi</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">t.GetMethod(</font><font color="#808080">"MyMethod"</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">PropertyInfo</font><font color="#808080">&nbsp;</font><font color="black">pi</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">t.GetProperty(</font><font color="#808080">"Number"</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Create an instance of MyDynamicType using the default <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// constructor. <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">object</font><font color="#808080">&nbsp;</font><font color="black">o1</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="#2b91af">Activator</font><font color="black">.CreateInstance(t)</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Display the value of the property, then change it to 127 and <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// display it again. Use null to indicate that the property<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// has no index.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Console</font><font color="black">.WriteLine(</font><font color="#808080">"o1.Number: {0}"</font><font color="black">,</font><font color="#808080">&nbsp;</font><font color="black">pi.GetValue(o1,</font><font color="#808080">&nbsp;</font><font color="blue">null</font><font color="black">))</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">pi.SetValue(o1,</font><font color="#808080">&nbsp;</font><font color="maroon">127</font><font color="black">,</font><font color="#808080">&nbsp;</font><font color="blue">null</font><font color="black">)</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Console</font><font color="black">.WriteLine(</font><font color="#808080">"o1.Number: {0}"</font><font color="black">,</font><font color="#808080">&nbsp;</font><font color="black">pi.GetValue(o1,</font><font color="#808080">&nbsp;</font><font color="blue">null</font><font color="black">))</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Call MyMethod, passing 22, and display the return value, 22<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// times 127. Arguments must be passed as an array, even when<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// there is only one.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">object</font><font color="black">[]</font><font color="#808080">&nbsp;</font><font color="black">arguments</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="black">{</font><font color="#808080">&nbsp;</font><font color="maroon">22</font><font color="#808080">&nbsp;</font><font color="black">}</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Console</font><font color="black">.WriteLine(</font><font color="#808080">"o1.MyMethod(22): {0}"</font><font color="black">,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="black">mi.Invoke(o1,</font><font color="#808080">&nbsp;</font><font color="black">arguments))</font><font color="blue">;</font><font color="#808080"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// Create an instance of MyDynamicType using the constructor<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// that specifies m_Number. The constructor is identified by<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// matching the types in the argument array. In this case, <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// the argument array is created on the fly. Display the <br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="darkgreen">// property value.<br></font><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">object</font><font color="#808080">&nbsp;</font><font color="black">o2</font><font color="#808080">&nbsp;</font><font color="blue">=</font><font color="#808080">&nbsp;</font><font color="#2b91af">Activator</font><font color="black">.CreateInstance(t,</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="blue">new</font><font color="#808080">&nbsp;</font><font color="blue">object</font><font color="black">[]</font><font color="#808080">&nbsp;</font><font color="black">{</font><font color="#808080">&nbsp;</font><font color="maroon">5280</font><font color="#808080">&nbsp;</font><font color="black">})</font><font color="blue">;</font><font color="#808080"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#2b91af">Console</font><font color="black">.WriteLine(</font><font color="#808080">"o2.Number: {0}"</font><font color="black">,</font><font color="#808080">&nbsp;</font><font color="black">pi.GetValue(o2,</font><font color="#808080">&nbsp;</font><font color="blue">null</font><font color="black">))</font><font color="blue">;</font><font color="#808080"><br></font></div> <div class="code"><font color="#808080">用完要unload或者只创建一次。否则可能导致high memory</div></font><img src ="http://www.cnblogs.com/fanweixiao/aggbug/1247238.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41938/" target="_blank">[新闻]新学年开始 大学生适用的十大互联网应用</a>]]></description></item><item><title>CentOS5.2下搭建Subversion服务器（官网错误修正版）</title><link>http://www.cnblogs.com/fanweixiao/archive/2008/07/18/1245575.html</link><dc:creator>new 维生素C.net()</dc:creator><author>new 维生素C.net()</author><pubDate>Thu, 17 Jul 2008 16:53:00 GMT</pubDate><guid>http://www.cnblogs.com/fanweixiao/archive/2008/07/18/1245575.html</guid><wfw:comment>http://www.cnblogs.com/fanweixiao/comments/1245575.html</wfw:comment><comments>http://www.cnblogs.com/fanweixiao/archive/2008/07/18/1245575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fanweixiao/comments/commentRss/1245575.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fanweixiao/services/trackbacks/1245575.html</trackback:ping><description><![CDATA[<p>看了<a title="http://wiki.centos.org/HowTos/Subversion" href="http://wiki.centos.org/HowTos/Subversion">http://wiki.centos.org/HowTos/Subversion</a>上的tutorial. 但是完全按照这个教程来做,必须忽略中间的一个问题：</p> <p>在完成第1、2步后, tutorial上说：</p> <p><em>Go test out whether or not you can access your repository from a web browser: </em><a href="http://yourmachine/repos"><em>http://yourmachine/repos</em></a><em>. You should get a popup box asking for a username and password. If so, type in your credentials and you should be displayed with a <strong>Revision 0:/ page</strong>.</em></p> <p>但是事实是你得到的只能是Forbidden, don't have permission的错误：</p> <h3><em>Forbidden</em></h3> <p><em>You don't have permission to access /repos on this server.</em> <p><em> <hr> Apache/2.2.3 (CentOS) Server at dev.onlyvc.cn Port 80</em></p> <p><br>这里正确的步骤是：</p> <ol> <li>在<em>/etc/conf.d/subversion.conf</em>里配置的<em>SVNPath /var/www/svn/repos</em>是根目录</li> <li>在/var/www/svn/repos/下用svnadmin create onlyvc来创建一个库</li> <li>chown --recursive apache.apache onlyvc给予apache的权限</li> <li>service httpd restart来重启apache</li> <li>访问<a href="http://localhost/repos/onlyvc">http://localhost/repos<strong>/onlyvc</strong></a></li></ol> <p>这样才是正确的能看到Revision 1的做法. 其他的部分都没有问题.</p> <p>good luck to you</p><img src ="http://www.cnblogs.com/fanweixiao/aggbug/1245575.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item></channel></rss>