Welcome 微信登录

首页 / 网页编程 / ASP.NET / Form中的ActiveX控件无法被GC回收

Form中的ActiveX控件无法被GC回收2011-12-30 博客园 duoduoz问题描述:在windows窗体中加入一ActiveX控件,例如axCanlendar,显式释放控件的资源,清除对它的引用后,该控件仍然无法被GC所回收。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

问题重现:在Form中加入一个axCanlendar控件及一个Button。按钮单击的代码如下:

private void button1_Click(object sender, EventArgs e)
{
this.Controls.Remove(this.axCalendar1);
WeakReference wr = new WeakReference(this.axCalendar1, false);
axCalendar1.Dispose();
//Marshal.ReleaseComObject(axCalendar1.GetOcx());
axCalendar1 = null;
int i = 0;
while (wr.IsAlive)
{
i++;
GC.Collect();
MessageBox.Show(i.ToString());
}
}
--------------------------------------------------------------------------------------------------------------------------

问题分析:.net的GC是通过引用来判断某一资源是否可以回收的,对于非托管资源,我们一般需要显式调用其Dispose或close等函数来释放非托管资源。但是当我们显式调用axCanlendar的Dispose函数释放资源,并且将其设为null后,GC仍然无法将其回收,说明它依然被某一变量引用着。那么到底是什么引用着它呢。我们利用windbg可以轻松地查看它的根。

0:009> !dumpheap -type AxMSACAL.AxCalendarLoading the heap objects into our cache.Address    MT   Size012c94f8 00978424   336  2 AxMSACAL.AxCalendar0:009> !gcroot 012c94f8ESP:12e5fc:Root: 012c8bd8(WindowsApplication4.Form1)-> 012cbc78(System.Windows.Forms.LayoutEventArgs)-> 012c94f8(AxMSACAL.AxCalendar)