代码改变世界

ArcObjects拾遗之一——初始化许可

2012-05-03 12:00 贼寇在何方 阅读(...) 评论(...) 编辑 收藏

ArcObjects是ArcGIS的底层API,基于COM技术搭建,所以能够自然地支持C++,VB,.Net在内的多种语言。然而也因为是基于COM的,所以它的API很是难用(相比.Net framework那样的)。虽然我用它来开发也有些时日了,但每次用起来,总能遇到一些烦人的小问题。既然这样,那就把他们记录下来,和大家一起分享好了。

 

我所用的系统环境是Windows 7 64位,Visual Studio 2010和ArcGIS 9.3/10。
当然,对于使用ArcObjects的项目,都请先在项目属性中设定生成的目标平台X86(考虑到64位的开发环境和运行环境)。

Visual Studio 2010对所有ArcObjects的引用,都缺省设定了嵌入互操作类型:True
所以大家在我的代码中看不到组件类后面的-Class后缀。


请使用Visual Studio 2008或者更低版本的同学把-Class后缀加上

 

在调用其他ArcObjects API之前,首先得初始化许可证:

using System;
using ESRI.ArcGIS.esriSystem; // ESRI.ArcGIS.System.dll
// using ESRI.ArcGIS.Version;

// 省略若干行

static void Initialize()
{
    // ArcGIS10需要绑定产品代码
    //RuntimeManager.Bind(ProductCode.EngineOrDesktop);

    // 初始化AO许可
    var aoi = new AoInitialize();
    var s = aoi.Initialize(
        esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);

    if (s == esriLicenseStatus.esriLicenseUnavailable)
        throw new NotSupportedException("请求的许可不可用");
}

 

ArcGIS 10新加了一个RuntimeManger(包含在ESRI.ArcGIS.Version中,这个dll也是新增的),在初始化AO前必须调用它的Bind方法,绑定对应的产品。

此外,esriLicenseProductCode一般可是设成Engine,在需要访问Geodatabase的时候,得设成EngineGeoDB(当然,前提是你有那GeoDB的许可)。