zoukankan      html  css  js  c++  java
  • .NET下的AO对象的安全释放

    AO底层基于COM架构,ESRI系列产品基本都直接AO组件。特点如下:

    1、原生的组件属于非托管组件,这可以从产品的进化过程得出结论。

    2、目前的托管组件例如AE .net开发包,都是直接通过RCW(runtime callable wrapper)方式调用AO底层的组件。

    3、Desktop依然是直接基于COM,通过CCW(COM Callable Wrapper)方式支持我们用.net写的一些组件(如command,tool等)。

    4、托管和非托管的比较,非托管的COM组件自己控制组件的生存周期,托管组件由CLR(Common Language Runtime)来管理,即通过GC(Garbage ollection)机制自动回收。

    由上述的第四个特点,托管组件自己不能控制生存期,CLR释放不及时,经常抛出各种COM错误,如果有循环操作,错误出现的频率非常高。

    如何避免:

    1、尽量不要用多线程操作,我们的产品本身不支持多线程,多线程是一个陷阱,虽然.net构建线程非常方便,但是一旦采用多线程问题将会无穷尽,而且多是不能调试的错误。

    2、AO的.net开发包中的对象释放方法 ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown() ;必须的,一般放在窗口关闭的Dispose函数中。 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(comObject); 用了他就不要用CLR中的释放函数。

    3、.net Framework 下的释放方法

    .NET Framework 1.1下的释放方法 System.Runtime.InteropServices.Marshal.ReleaseComObject(comObject); 一般写成

    while (Marshal.ReleaseComObject(comObject) > 0){}

    .NET Framework 2.0下的释放方法 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(comObject);

    代码中一般采用如下标准写法

    private void NAR(object o) 
    
    { 
    
    try 
    
    { 
    
    System.Runtime.InteropServices.Marshal.ReleaseComObject(o); 
    
    } 
    
    catch 
    
    { } 
    
    finally 
    
    { o = null; } 
    
    } 
    
    
    

    4、释放过程总结,1.1下的方法和2.0下的方法有不同,我们的组件最好还是用1.1的ReleaseComObject方法释放,2.0下的有时还会有异常抛出。.net中的com对象只手动释放一次即可。 特别需要注意new出来的对象。

    注:本文来自CSDN博客

  • 相关阅读:
    Android自定义之仿360Root大师水纹效果
    Android之TextView的Span样式源码剖析
    Android之TextView的样式类Span的使用详解
    随着ScrollView的滑动,渐渐的执行动画View
    仿微信主界面导航栏图标字体颜色的变化
    android自定义之 5.0 风格progressBar
    Android性能优化之内存篇
    Android性能优化之运算篇
    How to install Zabbix5.0 LTS version with Yum on the CentOS 7.8 system?
    How to install Zabbix4.0 LTS version with Yum on the Oracle Linux 7.3 system?
  • 原文地址:https://www.cnblogs.com/gisser/p/1793251.html
Copyright © 2011-2022 走看看