ArcEngine之Com释放(1)
来源:互联网 发布:我国的顶级域名 编辑:程序博客网 时间:2024/05/29 10:03
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出来的对象。
- ArcEngine之Com释放(1)
- ArcEngine之Com释放(2)
- ArcEngine中com对象的释放问题
- ArcEngine的COM对象在.NET中的释放问题
- ArcEngine正确释放资源
- [ArcEngine] 释放内存方法
- ArcEngine开发之打印地图(C#)
- ArcEngine开发之导出地图(C#)
- ArcEngine添加图层时,内存释放问题备注
- ArcEngine开发中内存不能释放浅析
- ArcEngine开发中内存不能释放
- COM接口释放问题
- 一起学习ArcEngine(1)-放大工具
- COM中初始获得ArcEngine授权
- ArcEngine开发之自定义工具栏--打开文件(C#)
- ArcEngine开发之自定义工具栏--地图放大、缩小(C#)
- ArcEngine开发之缓冲区分析实现(C#)
- ArcEngine二次开发API之Bug集(一 )
- POI操作Excel相关API总结
- 获取浏览器地址栏get请求的数据并存在一个对象中
- 二分答案、三分法{神解}
- UVa 439 Knight Moves——bfs
- AttributeError: 'module' object has no attribute 'face' 问题解决 opencv+python
- ArcEngine之Com释放(1)
- The Dole Queue uva133
- ubuntu 安装
- xgboost系列:windows和linux下xgboost安装指南
- ArcEngine之Com释放(2)
- 简历的艺术——潜台词
- 九度oj-1020-最小长方形
- BZOJ-1000 A + B Problem 丧心病狂
- VMVare8.0, Ubuntu14.04安装VMWare Tools找不到内核头文件解决方案