arcgis engine中的“System.Runtime.InteropServices.COMException”类型的第一次机会异常在...发生

arcgis engine 同时被 2 个专栏收录
4 篇文章 1 订阅
5 篇文章 0 订阅

1、介绍

  在我们利用arcgis engine编写程序时,或多或少会利用GP工具,会感受到GP工具带来的方便,但是GP工具好像有的时候并不是那么听话。比如最近小白我在写arcgis engine时调用GP工具就遇到不知所以然的Bug。

接下来我会介绍GP工具使用过程中某种bug以及相应的处理方式。

下面这个现象是在gp工具的输入参数,调用格式没有错误的情况下出现的bug,如果你的参数和调用的方式都有错误那就还不要利用提供的方法解决问题

2、bug

   在一个程序的运行的前半段,使用GP工具没有问题,但是当程序越来越多后,gp工具调用就会报出错误,或者干脆不报错直接快速跳过,没有留下一条处理的数据。

在大量的调试后,发现gp工具如果使用不当在错误列表的中会弹出下面怎样的一句话:

“System.Runtime.InteropServices.COMException”类型的第一次机会异常在...发生。其中省略号中可能是程序名或者是.dll文件之类的这样的错误提示。

后来在网上寻找到可以输出gp工具报错的提示,代码如下:

  try
            {
                gp.Execute(pLineToPolygon,null);
            }
            catch (COMException e)
            {
                string message = "";
                for (int i = 0; i < gp.MessageCount; i++)
                {
                    message += gp.GetMessage(i) + "\r\n";
                }
                MessageBox.Show(message + e.ToString());
            }

再次运行程序后,程序出现错误提示,错误如下图所示:

其中我们必须注意到特别的一句话:工作空间或数据源为只读

  3、分析

为什么工作空间或数据源只读,本人思考很久,可能是工作空间或者数据源被锁住了,因为我们经常使用Arcgis知道,两个软件打开一个shp文件后就会提示文件被锁住了,那么这个是不是这个问题那。接下来就是尝试的过程。

前期一直纠结“System.Runtime.InteropServices.COMException”类型的第一次机会异常在...发生 这个问题但是并没有找到解决的方法,后期就开始往文件被锁的情况考虑,以及如何解锁的尝试。

废话不多说,经过一边一边的查询网页资料,结果发现:
 

IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(shapeFileName); 
会产生sr.lock文件,即读取文件夹里的数据AE会锁住文件夹 

有的时候还会出现文件被锁住:IFeatureClass.Search()之后会生成rd.lock文件,IFeatureClass.Insert()之后会产生wr.lock文件。

4、解决方法

对于文件夹被锁住可以利用以下代码释放锁:
 

 IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
’‘’
打开数据的代码
‘’‘
IWorkspaceFactoryLockControl control = pWorkspaceFactory as IWorkspaceFactoryLockControl;
if(control.SchemaLockingEnabled)                
{	                   
  control.DisableSchemaLocking();              
}

本人的程序使用上面的代码就可以解决了,如果利用上面的代码运行还是出现上次提到的错误提示,那就是可能文件被锁住了,这可以采用下面的代码释放:

 System.Runtime.InteropServices.Marshal.ReleaseComObject(featureclass);
 System.Runtime.InteropServices.Marshal.ReleaseComObject(featurelayer);
 System.Runtime.InteropServices.Marshal.ReleaseComObject(layer);

5、结语

希望对AE的开发小伙伴们有一点帮助。

  • 1
    点赞
  • 0
    评论
  • 6
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

hakertop

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值