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博客

  • 相关阅读:
    2016/1/24 笔记 集合类 异常
    2016/1/22 3,将id为005的对象从集合中移除
    2016/1/22 1, 1-100 放集合 特定对象移除 2,List集合和Set集合是否可以重复添加
    2016/1/21 练习 arraylist 1,添加 add() 2,遍历集合
    2016/1/21 练习 创建 接口interface 应用implements 类class 并实例化调用
    2016/1/21 解读泛型
    2016/1/20 笔记 1, 包 引入 static 已经补充到类里 2,继承
    2016/1/20 总结构建子类对象时的顺序
    2016/1/20 继承作业
    笔记练习
  • 原文地址:https://www.cnblogs.com/gisser/p/1793251.html
Copyright © 2011-2022 走看看