ArcObjects编程方法(一):释放COM引用

版本:ArcGIS 10


AOUninitialize.Shutdown

由ArcGIS Engine开发的独立运行的应用,由于它包含了一个加载地图文档的MapControl控件,在推出程序时可能会遇到如下错误:"The instruction x references memory at x. The memory could not be read.”。这可能是由于COM对象残留在内存中,导致COM库无法从进程退出的结果。为避免该错误,可以使用ESRI.ArcGIS.ADF.Local程序集中的Shutdown静态方法,该方法确保在进程关闭之前卸载所有未使用的COM引用。可以在窗口(Form)控件的Disposed事件触发该方法:

[C#]

private void Form1_Disposed(object sender, System.EventArgs e)
{
    ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown();
}

ComReleaser class

ComReleaser类可以管理COM对象,确保代码执行完后释放COM,该类位于ESRI.ArcGIS.ADF.Connection.Local程序集中。ComReleaser类使用ReleaseCOMObjects方法释放COM对象,该方法只有在COM不再被托管代码使用时才调用。

Marshal.ReleaseComObject

.NET托管代码通过RCW对COM对象进行访问,托管代码被垃圾回收器自动回收。而COM对象在使用过程中会占用系统资源,比如文件控制、数据库连接等,这会导致很多错误,因此必须精确的释放特定的COM对象,从而释放系统资源。调用ReleaseComObject方法可以减少RCW对COM对象的引用计数,当引用计数减少为0时,RCW被标识为垃圾集。

调用ReleaseComObject会影响进程中所有对COM对象的引用。因此在进程内组件(比如加载到ArcGIS Desktop的态连接库DLL)中调用此方法,要特别小心。当多个组件同时对COM引用时,不要企图调用ReleaseComObject方法,例如一个组件保存了对MxDocument的引用,而且调用了ReleaseComObject方法,那么其他组件都不能访问到MxDocument对象。

以下代码显示通过ReleaseComObject方法释放StyleGallery对象:

[C#]

private void MyFunction()
{
    ESRI.ArcGIS.Display.IStyleGallery styCls = new
        ESRI.ArcGIS.Framework.StyleGalleryClass()as
        ESRI.ArcGIS.Display.IStyleGallery;
    // Use the StyleGalleryClass here.
    int refsLeft = 0;
    do
    {
        refsLeft = Marshal.ReleaseComObject(styCls);
    }
    while (refsLeft > 0);
}

转载于:https://www.cnblogs.com/xmwang/archive/2011/09/25/2189980.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值