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

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的开发小伙伴们有一点帮助。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArcGIS Engine 定义用于 `axToolbarControl1.AddItem` 添加的自定义工具对象,需要实现以下步骤: 1. 创建一个类,实现 ITool 接口。 ```csharp public class MyCustomTool : ESRI.ArcGIS.Framework.ITool { // ... } ``` 2. 实现 ITool 接口的方法,包括 OnCreate、OnClick、OnMouseDown 等事件处理方法。 ```csharp public void OnCreate(object hook){ // ... } public void OnClick(){ // ... } public void OnMouseDown(int Button, int Shift, int X, int Y){ // ... } ``` 3. 在 OnCreate 方法创建工具栏按钮的图标,并将其赋值给 Bitmap 以供之后使用。 ```csharp public void OnCreate(object hook){ // ... bitmap = new Bitmap(GetType().Assembly.GetManifestResourceStream("MyNamespace.MyCustomTool.png")); } ``` 4. 在 ITool 接口实现 Name、Caption、Category、Bitmap、Enabled 属性,以及 Cursor 属性和 ToolTip 属性。 ```csharp public string Name{ get { return "MyCustomTool"; } } public string Caption{ get { return "My Custom Tool"; } } public string Category{ get { return "My Custom Category"; } } public Bitmap Bitmap{ get { return bitmap; } } public bool Enabled{ get { return true; } } public int Cursor{ get { return -1; } } public string ToolTip{ get { return "My Custom Tool"; } } ``` 5. 在窗体的 `axToolbarControl1_OnCreate` 事件添加自定义工具对象。 ```csharp private void axToolbarControl1_OnCreate(object sender, IToolbarControlEvents_OnCreateEvent e){ // ... MyCustomTool myTool = new MyCustomTool(); axToolbarControl1.AddItem(myTool, -1, -1, false, -1, esriCommandStyles.esriCommandStyleIconAndText); } ``` 这样就可以在工具添加自定义工具对象了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值