问题描述:在windows窗体中加入
![](/icons/95575yi.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题重现:在Form中加入
![](/icons/95575yi.gif)
![](/icons/95575yi.gif)
![](/icons/95575dou2.gif)
![](/icons/95575de.gif)
private void button1_Click(object sender, EventArgs e)
{
this.Controls.Remove(this.axCalendar1);
WeakReference wr =
![](/icons/95575new.gif)
axCalendar1.Dispose
![](/icons/95575kh.gif)
//Marshal.ReleaseComObject(axCalendar1.GetOcx
![](/icons/95575kh.gif)
axCalendar1 = null;
![](/icons/95575int.gif)
while (wr.IsAlive)
{
i
![](/icons/95575jiajia.gif)
GC.Collect
![](/icons/95575kh.gif)
MessageBox.Show(i.
![](/icons/95575ToString.gif)
![](/icons/95575kh.gif)
}
}
--------------------------------------------------------------------------------------------------------------------------
问题分析:.net
![](/icons/95575de.gif)
![](/icons/95575yi.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575yi.gif)
![](/icons/95575diaoyong.gif)
![](/icons/95575hanshu.gif)
![](/icons/95575dou2.gif)
![](/icons/95575diaoyong.gif)
![](/icons/95575de.gif)
![](/icons/95575hanshu.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575yi.gif)
![](/icons/95575dou2.gif)
![](/icons/95575dou2.gif)
![](/icons/95575de.gif)
![](/icons/95575dou2.gif)
0:009> !dumpheap -type AxMSACAL.AxCalendar
Loading the heap objects
![](/icons/95575int.gif)
Address MT Size
012c94f8 00978424 336 2 AxMSACAL.AxCalendar
0:009> !gcroot 012c94f8
ESP:12e5fc:Root: 012c8bd8(WindowsApplication4.Form1)->
012cbc78(
![](/icons/95575System.gif)
012c94f8(AxMSACAL.AxCalendar)
可以看到axCalendar被LayoutEventArgs引用着
![](/icons/95575dou2.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
![](/icons/95575dou.gif)
![](/icons/95575System.gif)
![](/icons/95575hanshu.gif)
![](/icons/95575dou2.gif)
![](/icons/95575kh.gif)
![](/icons/95575string.gif)
[EditorBrowsable(EditorBrowsableState.Advanced)]
public void PerformLayout
![](/icons/95575kh.gif)
{
![](/icons/95575if.gif)
{
this.PerformLayout(this.cachedLayoutEventArgs);
this.cachedLayoutEventArgs = null;
this.SetState2(0x40, false);
}
![](/icons/95575else.gif)
{
this.PerformLayout(null, null);
}
}
同时
![](/icons/95575dou.gif)
![](/icons/95575diaoyong.gif)
![](/icons/95575dou2.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575de.gif)
![](/icons/95575dou2.gif)
![](/icons/95575hanshu.gif)
![](/icons/95575dou.gif)
![](/icons/95575string.gif)
![](/icons/95575string.gif)
![](/icons/95575yi.gif)
![](/icons/95575dou.gif)
![](/icons/95575diaoyong.gif)
![](/icons/95575dou2.gif)
![](/icons/95575if.gif)
{
this.SetState(0x200, true);
![](/icons/95575if.gif)
![](/icons/95575dd.gif)
{
this.cachedLayoutEventArgs = args;
![](/icons/95575if.gif)
{
this.SetState2(0x40, false);
}
}
}
所以我们可以利用以下 3句代码来将cachedLayoutEventArgs设为null
![](/icons/95575dou2.gif)
this.SuspendLayout
![](/icons/95575kh.gif)
this.PerformLayout(null, null);
this.ResumeLayout(false);
重新运行
![](/icons/95575chengxu.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575dou2.gif)
Root: 012c36ac(
![](/icons/95575System.gif)
012d0990(WindowsApplication4.Form1)->
012d0ae0(
![](/icons/95575System.gif)
012f885c(
![](/icons/95575System.gif)
![](/icons/95575zhk2.gif)
012f76f0(
![](/icons/95575System.gif)
012f781c(
![](/icons/95575System.gif)
012f7854(
![](/icons/95575System.gif)
![](/icons/95575zhk2.gif)
012d2500(AxMSACAL.AxCalendar)
现在
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
![](/icons/95575yi.gif)
![](/icons/95575int.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575diaoyong.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575yi.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575chushi.gif)
![](/icons/95575diaoyong.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575int.gif)
![](/icons/95575dou2.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575int.gif)
![](/icons/95575dou2.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575dou2.gif)
但是
![](/icons/95575dou.gif)
![](/icons/95575int.gif)
![](/icons/95575class.gif)
![](/icons/95575dou.gif)
![](/icons/95575diaoyong.gif)
![](/icons/95575dou2.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
private void MyFunc
![](/icons/95575kh.gif)
{
Type tControl = typeof(Control);
BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static
| BindingFlags.NonPublic | BindingFlags.Instance;
object objProperty = tControl.InvokeMember("Properties", bf | BindingFlags.GetProperty, null, (Control)this, null);
Type tProperty = objProperty.GetType
![](/icons/95575kh.gif)
object
![](/icons/95575zhk2.gif)
![](/icons/95575new.gif)
![](/icons/95575zhk2.gif)
tProperty.InvokeMember("SetObject", bf | BindingFlags.InvokeMethod, null, objProperty, args);
}
通过的前 3句代码加上这个
![](/icons/95575hanshu.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题整理总结:通过这个问题
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
![](/icons/95575de.gif)
![](/icons/95575de.gif)
![](/icons/95575yi.gif)
![](/icons/95575dou2.gif)
![](/icons/95575dou.gif)
![](/icons/95575de.gif)
![](/icons/95575dou.gif)
![](/icons/95575dou2.gif)
最新评论