问题描述:
最近的项目中涉及到离线编辑的问题,我的做法是根据业务需求在本地建一个FileGeodatabase数据库,在编辑过程中需要重新同步数据库时候,需要删除现有离线数据库,但是即使使用了System.Runtime.InteropServices.Marshal.FinalReleaseComObject(o),在删除数据库的时候,任然提示数据库文件被另外一个线程占用。
问题分析:
ArcObject.Net是在COM的基础上构建的, 因而客户只能在RCWs 的基础上进行COM组件的调用,COM对象是分配在非托管堆上的,因而GC无法管理其生命周期,这也会造成一些某名奇妙的问题,比如资源无法释放的问题。根据AO的开发文档,我们可以使用ComRelease来管理这些非托管资源,使用.net reflector看了一下ComReleaser的实现(AO 10.1中ComReleaser的实现在ESRI.ArcGIS.ADF.Connection.Local中),具体如下:
public class ComReleaser : IDisposable
{
// Fields
private ArrayList m_array;
// Methods
public ComReleaser();
public void Dispose();
protected virtual void Dispose(bool disposing);
protected override void Finalize();
public void ManageLifetime(object o);
public static void ReleaseCOMObject(object o);
}
<