<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_kevin-Y</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/16240/rss</id><updated>2012-05-09T01:35:10Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/16240/rss"/><entry><id>http://www.cnblogs.com/kevin-Y/archive/2012/05/09/2491209.html</id><title type="text">DataGridView的bug？！</title><summary type="text">昨天在查一个DataGridView当前焦点CheckBox不勾选问题，发现在修改DataGridView数据源的值很容易忽略的问题，或者叫DataGridView的bug绑定数据假定我们绑一个DataTable/// &lt;summary&gt;/// 当前数据。Form私有成员/// &lt;/summary&gt;DataTable curTable;/// &lt;summary&gt;/// 启动/// &lt;/summary&gt;/// &lt;param name="sender"&gt;&lt;/param&gt;/// &lt;param name=</summary><published>2012-05-09T01:29:00Z</published><updated>2012-05-09T01:29:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2012/05/09/2491209.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2012/05/09/2491209.html"/><content type="html">&lt;p&gt;昨天在查一个DataGridView当前焦点CheckBox不勾选问题，发现在修改DataGridView数据源的值很容易忽略的问题，或者叫DataGridView的bug&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;绑定数据&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假定我们绑一个DataTable&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 当前数据。Form私有成员&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;DataTable curTable;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 启动&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; TabForm_Load(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br/&gt;{&lt;br/&gt;    curTable &lt;/span&gt;=&lt;span style="color: #000000;"&gt; buildDataTable();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.dataGridViewY1.AutoGenerateColumns = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.dataGridViewY1.DataSource = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.curTable.DefaultView;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 生成数据源&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; DataTable buildDataTable()&lt;br/&gt;{&lt;br/&gt;    DataTable table &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DataTable();&lt;br/&gt;    table.Columns.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;    table.Columns.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;IsSelected&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;    table.Columns.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Title&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; i++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        DataRow row &lt;/span&gt;=&lt;span style="color: #000000;"&gt; table.NewRow();&lt;br/&gt;        row[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] =&lt;span style="color: #000000;"&gt; i;&lt;br/&gt;        row[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;IsSelected&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        row[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Title&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;标题 &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; i;&lt;br/&gt;        table.Rows.Add(row);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; table;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;好，我设置DataGrid的第一列为DataGridViewCheckBoxColumn，其DataPropertyName="IsSelected"。现在我们决定双击头时对这一行全选、全否&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; isSelected = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; dataGridViewY1_ColumnHeaderMouseClick(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, DataGridViewCellMouseEventArgs e)&lt;br/&gt;{&lt;br/&gt;    isSelected &lt;/span&gt;= !&lt;span style="color: #000000;"&gt;isSelected;&lt;br/&gt;    dataGridViewY1.BeginEdit(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; dataGridViewY1.Rows.Count; j++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        dataGridViewY1.Rows[j].Cells[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;].Value =&lt;span style="color: #000000;"&gt; isSelected;&lt;br/&gt;    }&lt;br/&gt;    dataGridViewY1.EndEdit();&lt;br/&gt; }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;发现Bug&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;好了，运行双击感觉没什么问题。但请注意，以下步骤你将发现问题：&lt;/p&gt;&lt;p&gt;1.先全选中&lt;br /&gt;2.点击一行的CheckBox，让其不勾选，再点击一次让其勾选&lt;br /&gt;3.点击行头，程序应尝试设置全否。&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;但你会发现刚才点击那行还处于勾选状态。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;全选/全否很容易，直接修改数据源就行&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; setAllSeleted(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; isTrue)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (DataRow row &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.curTable.Rows)&lt;br/&gt;        row[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;IsSelected&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] =&lt;span style="color: #000000;"&gt; isTrue;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;但有时难受需要对当前界面定位的行来进行设置&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j &amp;lt; dataGridViewY1.Rows.Count; j++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    DataRowView row &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.dataGridViewY1.Rows[j].DataBoundItem &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; DataRowView;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (row == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    row.BeginEdit();&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;必须先开始&lt;/span&gt;&lt;br/&gt;    row[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;IsSelected&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] =&lt;span style="color: #000000;"&gt; isTrue;&lt;br/&gt;    row.EndEdit();&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;好了，两种方式，按需选择。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/2491209.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2012/05/09/2491209.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2012/05/07/2487179.html</id><title type="text">RichTextBox与拖放</title><summary type="text">1.自动拖放只支持DragDropEffects.Move近日需要程序在运行时将TreeView节点拖放到RichTextBox。发现RichTextBox没有DragOver等事件，但有EnableAutoDragDrop属性，于是设置为true。运行程序，可以从外部拖放一些文本、图片到RichTextBox，但是从TreeView拖放节点到RichTextBox时，老是显示类似禁止的那个小图标，无法拖放。难道RichTextBox对于内部拖放没有效果？以下是TreeView点击开始拖放的代码private void treeView1_MouseDown(object sender, Mo</summary><published>2012-05-07T04:11:00Z</published><updated>2012-05-07T04:11:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2012/05/07/2487179.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2012/05/07/2487179.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1.自动拖放只支持DragDropEffects.Move&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;近日需要程序在运行时将TreeView节点拖放到RichTextBox。发现RichTextBox没有DragOver等事件，但有EnableAutoDragDrop属性，于是设置为true。运行程序，可以从外部拖放一些文本、图片到RichTextBox，但是从TreeView拖放节点到RichTextBox时，老是显示类似禁止的那个小图标，无法拖放。难道RichTextBox对于内部拖放没有效果？&lt;/p&gt;&lt;p&gt;以下是TreeView点击开始拖放的代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; treeView1_MouseDown(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, MouseEventArgs e)&lt;br/&gt;{&lt;br/&gt;    TreeNode mNode&lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.treeView1.GetNodeAt(e.X, e.Y);&lt;br/&gt;    treeView1.SelectedNode &lt;/span&gt;=&lt;span style="color: #000000;"&gt; mNode;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (mNode != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        treeView1.DoDragDrop(mNode.Text, DragDropEffects.Copy);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;增加一个TextBox来接受拖放。证明上面的代码是可以的。无聊之时，将&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;treeView1.DoDragDrop(mNode.Text, DragDropEffects.Copy);&lt;/div&gt;&lt;p&gt;修改为&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;treeView1.DoDragDrop(mNode.Text, DragDropEffects.Move);&lt;/div&gt;&lt;p&gt;奇迹发生了，可以拖放进去了。RichTextBox什么代码都不用写，只用设置EnableAutoDragDrop=true。看来RichTextBox的自动拖放只支持DragDropEffects.Move。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.非自动的拖放&lt;strong&gt;（EnableAutoDragDrop=false)&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其实RichTextBox设计器里没有DragOver等事件，但我们可以手工添加代码。需要注意的是，非自动也只支持&lt;span style="color: #000000;"&gt;DragDropEffects.Move&lt;/span&gt;.&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.richTextBox1.AllowDrop = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.richTextBox1.DragEnter += &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DragEventHandler(richTextBox1_DragEnter);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.richTextBox1.DragDrop += &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DragEventHandler(richTextBox1_DragDrop);&lt;/div&gt;&lt;p&gt;这样我们就可以自己来决定RichTextBox允许拖放的内容。设置EnableAutoDragDrop=false，以下方法限定RichTextBox只接受Text的拖放&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; richTextBox1_DragDrop(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, DragEventArgs e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; txt = e.Data.GetData(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Text&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.IsNullOrEmpty(txt))&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.richTextBox1.SelectedText =&lt;span style="color: #000000;"&gt; txt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; richTextBox1_DragEnter(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, DragEventArgs e)&lt;br/&gt;{            &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Data.GetDataPresent(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Text&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br/&gt;        e.Effect &lt;/span&gt;=&lt;span style="color: #000000;"&gt; DragDropEffects.Move;//注意，也只支持Move&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        e.Effect &lt;/span&gt;=&lt;span style="color: #000000;"&gt; DragDropEffects.None;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/2487179.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2012/05/07/2487179.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/12/01/2271310.html</id><title type="text">remoting怪现象。方法长时间不返回，也不报异常。</title><summary type="text">功能：下载文件。方式：调用Remoting方法，得到整个文件的字节数组，写到本地文件。代码：public static bool DownloadFromTestPool(string pFileName, string pLocalFullPath){ bool isOk = true; System.IO.FileStream write = null; try { System.IO.FileInfo file = new FileInfo(pLocalFullPath); if (!file.Directory.Exists) ...</summary><published>2011-12-01T15:15:00Z</published><updated>2011-12-01T15:15:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/12/01/2271310.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/12/01/2271310.html"/><content type="html">&lt;p&gt;功能：下载文件。&lt;/p&gt;&lt;p&gt;方式：调用Remoting方法，得到整个文件的字节数组，写到本地文件。&lt;/p&gt;&lt;p&gt;代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; DownloadFromTestPool(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; pFileName, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; pLocalFullPath)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; isOk = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;    System.IO.FileStream write = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        System.IO.FileInfo file = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileInfo(pLocalFullPath);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!file.Directory.Exists)&lt;br /&gt;            file.Directory.Create();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] buffer = Factory.MessionFacade.DownFromTestPool(pFileName);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Factory.MessionFacade为Remoting远程代理&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        write = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileStream(pLocalFullPath, FileMode.Create);&lt;br /&gt;        write.Write(buffer, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, buffer.Length);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;    {&lt;br /&gt;        isOk = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;        GeneralMethod.HandleException(ex);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (write != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            write.Close();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; isOk;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;以上方法多次使用都没有问题。但近来出现了一个怪现象。连续下载多个文件时，一般在第三个文件，以下这行代码会长时间无返回，也不抛异常，相当的无奈。&lt;/p&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] buffer = Factory.MessionFacade.DownFromTestPool(pFileName);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Factory.MessionFacade为Remoting远程代理&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/12/01/2271310.html" target="_blank"&gt;心想&lt;/a&gt;是不是一次的字节数组过大，在某些公网的情况下会有问题呢？ 改为使用断点分次下载，情况依旧。由于方法是长时间不返回且无异常，只好利用异步超时的方式去检测这种情况，并重新调用Remoting方法方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('dd727cf0-87d2-4f96-adc5-e3b883a2c0eb')"&gt;&lt;div id="cnblogs_code_open_dd727cf0-87d2-4f96-adc5-e3b883a2c0eb" class="cnblogs_code_hide"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; SyncDownloader&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] DownloadBytesHandle(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; pFileName, &lt;span style="color: #0000ff;"&gt;long&lt;/span&gt; pPosition, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pMaxSize);&lt;br /&gt;&lt;br /&gt;        System.IO.FileStream write = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;long&lt;/span&gt; pos = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; lastReceiveSize = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; bufferVersion = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        SyncDownloadItem curDown;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; SyncDownloader()&lt;br /&gt;        {&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; ManualResetEvent timeoutObject = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ManualResetEvent(&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; StartDownload(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fileName, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; localFullPath)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; buffersize = &lt;span style="color: #800080;"&gt;50000&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;默认500K一次   25000 12500 6000 3000  1500   &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            bufferVersion = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            pos = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            lastReceiveSize = buffersize;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;默认与最大的一致&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; isOk = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; timeoutTimes = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;超时20次退出下载。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                System.IO.FileInfo file = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileInfo(localFullPath);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!file.Directory.Exists)&lt;br /&gt;                    file.Directory.Create();&lt;br /&gt;                write = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileStream(localFullPath, FileMode.Create);                &lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;)&lt;br /&gt;                {                    &lt;br /&gt;                    timeoutObject.Reset();&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (lastReceiveSize &amp;lt; buffersize)&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                    bufferVersion++;&lt;br /&gt;                               &lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;异步下载&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    DownloadBytesHandle fh = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DownloadBytesHandle(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.dwonloadBytes);&lt;br /&gt;                    AsyncCallback callback = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AsyncCallback(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.downloadCallback);&lt;br /&gt;                    IAsyncResult ar = fh.BeginInvoke(fileName, pos, buffersize, callback, bufferVersion);&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!timeoutObject.WaitOne(&lt;span style="color: #800080;"&gt;10000&lt;/span&gt;))&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;10秒应能下载完成&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    {&lt;br /&gt;                        timeoutTimes++;&lt;br /&gt;                        Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;_{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, timeoutTimes);  &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;超时加下划线                      &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (timeoutTimes &amp;gt; &lt;span style="color: #800080;"&gt;20&lt;/span&gt;)&lt;br /&gt;                            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;超时&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (buffersize &amp;gt; &lt;span style="color: #800080;"&gt;3000&lt;/span&gt;)&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;10秒无论如何都应能下载1.5K&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                            buffersize = buffersize / &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;超时下载尺寸减半。                        &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    }&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                    {                        &lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] buffer = fh.EndInvoke(ar);&lt;br /&gt;                        Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;不断的加点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                        write.Write(buffer, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, buffer.Length);&lt;br /&gt;                        pos += buffer.Length;&lt;br /&gt;                        lastReceiveSize = buffer.Length;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                isOk = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                isOk = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;                GeneralMethod.HandleException(ex);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (write != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;                    write.Close();&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; isOk;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; downloadCallback(IAsyncResult ar)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; dbVer = Convert.ToInt32(ar.AsyncState);           &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (dbVer == &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.bufferVersion)&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;只有当次调用才释放&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                timeoutObject.Set();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] dwonloadBytes(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; pFileName, &lt;span style="color: #0000ff;"&gt;long&lt;/span&gt; pPosition, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pMaxSize)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;System.Threading.Thread.Sleep(11000);&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;睡11秒。判断是否还会执行。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;            {                &lt;br /&gt;                buffer = Factory.AreaIssueFacade.DownFromTestPool(pFileName, pPosition, pMaxSize);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; { }&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;忽略所有错误&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; buffer;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;利用上面的代码，下载4个文件，以下是过程日志。每一个点代表一次成功调用，下划线代表超时，下划线后面的数字代表第几次超时。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;开始从发布服务器下载文件..&lt;br /&gt;下载HIS.Mattgr.UI.dll.......... 从发布服务器下载成功&lt;br /&gt;下载HIS.Mattgr.Services.dll............ 从发布服务器下载成功&lt;br /&gt;下载HIS.Mattgr.Interface.dll_1_2_3......... 从发布服务器下载成功&lt;br /&gt;下载HIS.PublicMattgr.Services.dll......... 从发布服务器下载成功&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/12/01/2271310.html"&gt;每次的日志&lt;/a&gt;都显示在第三个文件一开始都会有连续的三次调用超时，而之后又会很快。真走运，如此稳定的异常情况。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/2271310.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/12/01/2271310.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/09/08/2171019.html</id><title type="text">找了一段生成ClickOne的快捷方式的生成代码</title><summary type="text">找了一段生成ClickOne的快捷方式的生成代码，晚上回去试试能否可用。</summary><published>2011-09-08T02:23:00Z</published><updated>2011-09-08T02:23:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/09/08/2171019.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/09/08/2171019.html"/><content type="html">&lt;p&gt;找了一段生成ClickOne的快捷方式的生成代码，晚上回去试试能否可用。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CheckForShortcut()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    ApplicationDeployment ad &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ApplicationDeployment.CurrentDeployment;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ad.IsFirstRun)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        Assembly code &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Assembly.GetExecutingAssembly();&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; company &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; description &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Attribute.IsDefined(code, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(AssemblyCompanyAttribute)))&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            AssemblyCompanyAttribute ascompany &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (AssemblyCompanyAttribute)Attribute.GetCustomAttribute(code,&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(AssemblyCompanyAttribute));&lt;br /&gt;&lt;br /&gt;            company &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ascompany.Company;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Attribute.IsDefined(code, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(AssemblyDescriptionAttribute)))&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            AssemblyDescriptionAttribute asdescription &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(code,&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(AssemblyDescriptionAttribute));&lt;br /&gt;&lt;br /&gt;            description &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; asdescription.Description;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (company &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; description &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty)&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; desktopPath &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;&lt;br /&gt;            desktopPath &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Concat(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, description, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.appref-ms&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; shortcutName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;&lt;br /&gt;            shortcutName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Concat(Environment.GetFolderPath(Environment.SpecialFolder.Programs),&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, company, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, description, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.appref-ms&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;            System.IO.File.Copy(shortcutName, desktopPath, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/2171019.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/09/08/2171019.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/06/10/2077495.html</id><title type="text">持续集成好工具CruiseControl.Net</title><summary type="text">我不希望程序员各自编译一份dll来发布，希望由统一的一台机器自动获取源代码并自动生成发布的文件。原来这叫持续集成。这是园内的文章。这里收藏一下。http://www.cnblogs.com/cnblogsfans/archive/2008/04/24/1169689.htmlhttp://www.cnblogs.com/greatqn/archive/2008/08/05/1261298.html</summary><published>2011-06-10T04:01:00Z</published><updated>2011-06-10T04:01:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/06/10/2077495.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/06/10/2077495.html"/><content type="html">&lt;p&gt;我不希望程序员各自编译一份dll来发布，希望由统一的一台机器自动获取源代码并自动生成发布的文件。&lt;/p&gt;&lt;p&gt;原来这叫持续集成。这是园内的文章。这里收藏一下。&lt;/p&gt;&lt;p&gt;http://www.cnblogs.com/cnblogsfans/archive/2008/04/24/1169689.html&lt;/p&gt;&lt;p&gt;http://www.cnblogs.com/greatqn/archive/2008/08/05/1261298.html&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/2077495.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/06/10/2077495.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/05/20/2052226.html</id><title type="text">如果取出绑定到事件的方法数量</title><summary type="text">// 事件访问器的定义int eventCount=0; public event EventHandler NumberChanged { add { eventCount++; numberChanged = value; } remove { eventCount--; numberChanged -= value; } }或取委托数组public event EventHandler NumberChanged;//某个方法内Delegate[] delegates = NumberChanged.GetInvocationList();</summary><published>2011-05-20T09:49:00Z</published><updated>2011-05-20T09:49:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/05/20/2052226.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/05/20/2052226.html"/><content type="html">&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 事件访问器的定义&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; eventCount&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; EventHandler NumberChanged {&lt;br /&gt;        add {&lt;br /&gt;    eventCount&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            numberChanged &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;        }&lt;br /&gt;        remove {&lt;br /&gt;     eventCount&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            numberChanged &lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;或取委托数组&lt;br /&gt;public event EventHandler &lt;span style="color: #000000;"&gt;NumberChanged&lt;/span&gt;;&lt;br /&gt;//某个方法内&lt;br /&gt;Delegate[] delegates = &lt;span style="color: #000000;"&gt;NumberChanged&lt;/span&gt;.GetInvocationList();&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/2052226.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/05/20/2052226.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982118.html</id><title type="text">AppDomain加载与释放dll</title><summary type="text">几年前写过同名随笔，但今天应不大适用了。但还有几个朋友留言关注，我重新发布相关代码。首先我们的目的就是运行期间更新dll，并应用dll。这个过程需要应用AppDomain来解决，办法就是创建新的AppDomain加载dll，并在dll更新后创建新的AppDomain来加载新的dll。好了，我们有两个目录需要完成。第一个目标：运行时能更新dll。1.创建AppDomain时设置ShadowCopyFilesAppDomainSetup _setup = new AppDomainSetup();_setup.ShadowCopyFiles = "true";_setup.Lo</summary><published>2011-03-12T03:49:00Z</published><updated>2011-03-12T03:49:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982118.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982118.html"/><content type="html">&lt;p&gt;几年前写过同名随笔，但今天应不大适用了。但还有几个朋友留言关注，我重新发布相关代码。&lt;/p&gt;&lt;p&gt;首先我们的目的就是运行期间更新dll，并应用dll。这个过程需要应用&amp;nbsp;AppDomain来解决，办法就是创建新的AppDomain加载dll，并在dll更新后创建新的AppDomain来加载新的dll。&lt;/p&gt;&lt;p&gt;好了，我们有两个目录需要完成。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一个目标：运行时能更新dll。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.创建AppDomain时设置ShadowCopyFiles&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;AppDomainSetup _setup &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; AppDomainSetup();&lt;br /&gt;_setup.ShadowCopyFiles &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;true&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;_setup.LoaderOptimization &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; LoaderOptimization.SingleDomain;&lt;br /&gt;AppDomain _curDomain &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; AppDomain.CreateDomain(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestDomain&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, _setup);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;2.当我们的主程序需要引用动态加载dll中的某个对象的实例时，该实例必须创建为代理类。代理类的意思是类需要继承自MarshalByRefObject。此外一般会使用另一个公共类库定义基类或接口来使用这个代理类。好了，先看怎么样在前面创建的程序域中创建代理类的实例&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;System.Runtime.Remoting.ObjectHandle objHandle &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; pJobDomain.CreateInstanceFrom(strDllFilePath, strClassName);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; objBuild &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; objHandle.Unwrap();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (objBuild &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Exception(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;buildWorker -- 创建对象失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    ido &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IDo)objBuild;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;IDo是一个接口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;好了，如果&lt;span style="color: #000000;"&gt;strDllFilePath=&amp;ldquo;ClassLibrary.dll&amp;rdquo;，那么&lt;span style="color: #000000;"&gt;运行目录的&lt;/span&gt;ClassLibrary.dll文件被加载后，我们还是可以随便更新他的&lt;span style="color: #000000;"&gt;。但更新后，程序域不重新创建的话，&lt;span style="color: #000000;"&gt;&lt;span style="color: #000000;"&gt;使用上面的方法再次创建代理实例，&lt;/span&gt;&lt;/span&gt;我们的程序依然看不到新的dll的运行效果的，因为我们加载时设置了ShadowCopyFiles="true"。当然你可能会说设置为"false"行不行呢？你可以试试，但我要说的是，如果这样的话，我们第一个目标都完成不了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #000000;"&gt;第二个目标：应用新的dll。&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #000000;"&gt;其实很简单，UnLoad后再创建一次，使用新的AppDomain创建代理类 ，程序就能看到新dll的效果。好，我定义了一个方法保证每运行一次都会创建一个新的程序域&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #000000;"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;AppDomain _curDomain;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; load()&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_curDomain &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;已创建了程序域&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;        AppDomain.Unload(_curDomain);&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;先关闭再打开。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        _curDomain &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }            &lt;br /&gt;    AppDomainSetup _setup &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; AppDomainSetup();&lt;br /&gt;    _setup.ShadowCopyFiles &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;true&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;            &lt;br /&gt;    _setup.LoaderOptimization &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; LoaderOptimization.SingleDomain;    &lt;br /&gt;    _curDomain &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; AppDomain.CreateDomain(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestDomain&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, _setup);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;提供一个&lt;a href="http://files.cnblogs.com/kevin-Y/AssemblyTestDomain.rar"&gt;kevin-y的测试的源代码&lt;/a&gt; 给大家下载&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/1982118.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982118.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982012.html</id><title type="text">“创建窗口句柄时出错” -- 不要过份相信垃圾回收</title><summary type="text">我总相信只要对象离开其作用域并没有被引用到，dotnet会帮我们回收他，当然一般还会告诉我们IO操作（网络也可视为IO操作的一类）需要主动关闭。而我一直忽略了控件也是需要这么做的。工作让我接触到了一个很古怪的问题，客户反馈说每天有一台机器到了11点就会出错。观察并细听用者的反应，我认为与使用次数有关。界面动态不断地加载不定数量的用户控件。起初怀疑是不是反射在某些应用下会引起问题，于是写了个项目模拟实际的应用，测试以下三种办法创建一个用户控件的差异 /// &lt;summary&gt; /// 方式一：全程反射 /// &lt;/summary&gt; /// &lt;returns&gt;&amp;</summary><published>2011-03-12T00:53:00Z</published><updated>2011-03-12T00:53:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982012.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982012.html"/><content type="html">&lt;p&gt;我总相信只要对象离开其作用域并没有被引用到，dotnet会帮我们回收他，当然一般还会告诉我们IO操作（网络也可视为IO操作的一类）需要主动关闭。而我一直忽略了控件也是需要这么做的。&lt;/p&gt;&lt;p&gt;工作让我接触到了一个很古怪的问题，客户反馈说每天有一台机器到了11点就会出错。观察并细听用者的反应，我认为与使用次数有关。界面动态不断地加载不定数量的用户控件。起初怀疑是不是反射在某些应用下会引起问题，于是写了个项目模拟实际的应用，测试以下三种办法创建一个用户控件的差异&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 方式一：全程反射&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControl createUserControl()&lt;br /&gt; {&lt;br /&gt;     Assembly asm &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Assembly.Load(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ClassLibrary&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;     UserControl ctl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; asm.CreateInstance(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ClassLibrary.MyEditContro&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControl;&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ctl;&lt;br /&gt; }&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 缓存Assembly&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; Assembly asmOne &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Assembly.Load(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ClassLibrary&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 方式二：缓存Assembly&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControl createUserControlOne()&lt;br /&gt; {&lt;br /&gt;     UserControl ctl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; asmOne.CreateInstance(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ClassLibrary.MyEditContro&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControl;&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ctl;&lt;br /&gt; }&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 方式三：不使用反射&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControl createMySelf()&lt;br /&gt; {&lt;br /&gt;     ClassLibrary.MyEditContro ctl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ClassLibrary.MyEditContro();&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ctl;&lt;br /&gt; }      &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;好了，我要不断的创建ClassLibrary.MyEditContro 控件并添加到一个Pannel中显示，以下是测试的主体方法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; runTest(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; pMax,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; pMethod)&lt;br /&gt;{&lt;br /&gt;    curNo &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; pMax; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        curNo&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        UserControl ctl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (pMethod)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;                ctl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; createUserControl();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;                ctl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; createUserControlOne();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;                ctl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; createMySelf();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }                    &lt;br /&gt;        ctl.Dock &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; DockStyle.Fill;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.panel1.Controls.Clear();&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.panel1.Controls.Add(ctl);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.richTextBox1.AppendText(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}.完成测试.\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, curNo));&lt;br /&gt;        Application.DoEvents();        &lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;结果三种方法，在创建400多次后都报以下异常&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;System.ComponentModel.Win32Exception: 创建窗口句柄时出错。&lt;br /&gt;   在 System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)&lt;br /&gt;   在 System.Windows.Forms.Control.CreateHandle().....&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;如何解决了？去除不断创建控件的方式，只保留一个实例？其实我认为这是最理想的。不过解决问题应优先从最简便有效的方式去考虑，同事想到了在UserControl使用完后Dispose，于是在Application.DoEvents后加上一句&amp;ldquo;ctl.Dispose();&amp;rdquo;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;...&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.panel1.Controls.Clear();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.panel1.Controls.Add(ctl);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.richTextBox1.AppendText(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}.完成测试.\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, curNo));&lt;br /&gt;Application.DoEvents();&lt;br /&gt;ctl.Dispose();&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;控件使用完后Dispose。主体测试方法增加这一句。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;最后结果是三个方法都顺利通过1000次的创建显示。&lt;/p&gt;&lt;p&gt;你可以&lt;a href="http://files.cnblogs.com/kevin-Y/AssemblyTest.rar"&gt;下载kevin-y的测试项目的源代码&lt;/a&gt;，并提出你的宝贵意见&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/1982012.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/03/12/1982012.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/01/27/1946268.html</id><title type="text">反射-效率</title><summary type="text">写了个小程序想看看反射对于效率的影响。public class Class1:IClass//IClass是一个接口，只有一个方法int GetResult(int pMax){ public int GetResult(int pMax) { int result = 0; for (int i = 0; i &lt; pMax; i++) result += i; return result; }}类属于使用ClassLibrary类库。以下是直接调用的代码。int iMax = int.Parse(this.textBox1.Text);DateTime start = DateTime</summary><published>2011-01-27T07:24:00Z</published><updated>2011-01-27T07:24:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/01/27/1946268.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/01/27/1946268.html"/><content type="html">&lt;p&gt;写了个小程序想看看反射对于效率的影响。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Class1:IClass&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;IClass是一个接口，只有一个方法int GetResult(int pMax)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetResult(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; pMax)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; result &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; pMax; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            result &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; i;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; result;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;类属于使用ClassLibrary类库。以下是直接调用的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; iMax &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Parse(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.textBox1.Text);&lt;br /&gt;DateTime start &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; DateTime.Now;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; result &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; iMax; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    ClassLibrary.Class1 test &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ClassLibrary.Class1();&lt;br /&gt;    result &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; test.GetResult(&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;br /&gt;TimeSpan span &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; DateTime.Now &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; start;&lt;br /&gt;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;共用时{0}毫秒&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, span.TotalMilliseconds);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;iMax达到10万次时，用时&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;共用时31.25毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时15.625毫秒&lt;br /&gt;共用时15.625毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时31.25毫秒&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;反射调用&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; iMax &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Parse(this.textBox1.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Text&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DateTime&lt;/span&gt;&lt;span style="color: #000000;"&gt; start &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DateTime&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Now;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; result &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;//&lt;/span&gt;&lt;span style="color: #000000;"&gt;A.放这差别不大。&lt;br /&gt;Type type &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Type.GetType("ClassLibrary.Class1,ClassLibrary");&lt;/span&gt;&lt;span style="color: #808080;"&gt;//&lt;/span&gt;&lt;span style="color: #000000;"&gt;A.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; iMax; i&lt;/span&gt;&lt;span style="color: #808080;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;//&lt;/span&gt;&lt;span style="color: #000000;"&gt;B.放在这的话，用时跟直接调用时差别很远&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;//&lt;/span&gt;&lt;span style="color: #000000;"&gt;Type type &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Type.GetType("ClassLibrary.Class1,ClassLibrary");&lt;/span&gt;&lt;span style="color: #808080;"&gt;//&lt;/span&gt;&lt;span style="color: #000000;"&gt;B.&lt;br /&gt;    ClassLibrary.IClass test &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Activator.CreateInstance(type) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; ClassLibrary.IClass;&lt;br /&gt;    result &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; test.GetResult(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;br /&gt;TimeSpan span &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DateTime&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Now &lt;/span&gt;&lt;span style="color: #808080;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; start;&lt;br /&gt;Console.WriteLine("共用时{&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;}毫秒", span.TotalMilliseconds);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;iMax同样的10万次，测试结果&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;共用时46.875毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时31.25毫秒&lt;br /&gt;共用时46.875毫秒&lt;br /&gt;共用时31.25毫秒&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果反射调用时，每次都重新加载Type的话（使用B点的代码）用时会大幅增加。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;共用时1593.75毫秒&lt;br /&gt;共用时1593.75毫秒&lt;br /&gt;共用时1593.75毫秒&lt;br /&gt;共用时1593.75毫秒&lt;br /&gt;共用时1593.75毫秒&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;但是，我们细心算算这个大幅增加的情况，10万次的过程，如果我们的程序只需要保证1秒内响应100个处理要求，那完全可以忽然反射对于性能的影响，就算1秒内做1000次上面的反射过程，也只比直接调用多用了不到0.02秒（15毫秒）。&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/1946268.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/01/27/1946268.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kevin-Y/archive/2011/01/01/1923666.html</id><title type="text">让方法接受匿名参数</title><summary type="text">我有一个Linq的查询如下：代码我的问题就是，如何把prcptods传给某个方法进行处理呢？网上有会传递匿名参数的文章，我参考其中的代码，定义了以下方法代码于是linq查到的结果我就能这样使用Build(prcptods);</summary><published>2011-01-01T02:03:00Z</published><updated>2011-01-01T02:03:00Z</updated><author><name>生命体验之kevin-Y</name><uri>http://www.cnblogs.com/kevin-Y/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kevin-Y/archive/2011/01/01/1923666.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kevin-Y/archive/2011/01/01/1923666.html"/><content type="html">&lt;p&gt;我有一个Linq的查询如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('652e8f18-e676-4b02-8575-95e092ed2664')"&gt;&lt;div id="cnblogs_code_open_652e8f18-e676-4b02-8575-95e092ed2664" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;var prcptods &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                (from p &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; pPrcpToDrugstoreLi&lt;br /&gt;                 from o &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; pDSDetailLis&lt;br /&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; (p.PId &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; o.PId &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; p.PrcpId &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; o.PrcpId &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; p.PrcpTableType &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; o.PrcpTableType &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; o.PrcpTableType &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;代理&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                 select &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; { OutVisitId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; p.OutVisitId, InvoiceNo &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; p.InvoiceNo, RcpId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; p.RcpId, PatFeeInfoId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; p.PatFeeInfoId, DeptId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; p.DeptId }).Distinct();&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我的问题就是，如何把prcptods传给某个方法进行处理呢？网上有会传递匿名参数的文章，我参考其中的代码，定义了以下方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('cc75cb1f-b3cc-4ccd-aad8-e24b5507876a')"&gt;&lt;div id="cnblogs_code_open_cc75cb1f-b3cc-4ccd-aad8-e24b5507876a" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Build(IEnumerable pTempDSDetails)&lt;br /&gt;{&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var tempOne &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; pTempDSDetails) &lt;br /&gt;   {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;恢复tempOne的匿名探测                &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        var resultOne &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CastAnonymous(tempOne, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; { OutVisitId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, InvoiceNo &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;, RcpId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;, PatFeeInfoId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, DeptId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; });&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用resultOne&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;....&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; T CastAnonymous&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; anonymous, T anonymousType){    &lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (T)anonymous;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;于是linq查到的结果我就能这样使用&lt;/p&gt;&lt;p&gt;Build(prcptods);&lt;/p&gt;&lt;img src="http://www.cnblogs.com/kevin-Y/aggbug/1923666.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kevin-Y/archive/2011/01/01/1923666.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
