通过代码方式,初始化AE控件许可

以前在AE开发都是选择直接拖拽arcgis listense控件,在属性面板里面直接勾选拓展模块,很是方便,但是并不是所有的开发都可以这样,有时候会不方便加LicenseControl控件,需要用代码初始化许可:

1)最简单的初始化。

新建一个window应用程序,添加必要的引用,不要添加许可控件进去

RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

2)初始化扩展模块许可

 IAoInitialize _IAoInitialize = newAoInitializeClass();

记得在这句之前要事先绑定你需要初始化的产品类型。

 RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

表示绑定为AE或者桌面应用程序。不然运行要报错,AE也会自动提示需要绑定。

在一切都绑定之后,开始初始化:

 _IAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);//初始化engine许可,

esriLicenseProductCode 表示不同的产品,根据自己需要添加。

经过上面的这些,基本的许可我们都初始化了,再不进行扩展模块分析下,程序都可以健壮的运行。但是如果功能里面有空间分析功能,这就需要添加相应的跨站模块许可。

CheckOutExtension方法用来在添加扩展模块的许可,添加的前提是Initialize过产品类型。

_IAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);

通过这一句就可以添加3D分析功能了。

esriLicenseExtensionCode枚举类型里面包含了ArcGIS所有的扩展模块类型39个(详细的看帮助),需要那个依次添加即可。

与CheckOutExtension对应的CheckInExtension方法,用来移除某个扩展模块的许可。

 

3)许可检查

经常的在对许可初始化的时候,都需要检查一下初始化是否完成成功。

IAoInitialize接口提供了三个方法,用来对初始化过程的检查。

 _IAoInitialize.IsExtensionCodeAvailable();//检查扩展许可时候可用

_IAoInitialize.IsExtensionCheckedOut();//检查某个扩展许可是否被添加

 _IAoInitialize.IsProductCodeAvailable();//检查主产品的许可是否可用

许可检查可以让我们在对许可初始化失败或者成功后做出相应的处理。经过上面这些,无伦需要那些许可来保证代码正确执行,都可以顺利的完成。

    /// <summary>
        /// 用来初始化许可
        /// </summary>
        public static void InitLicense()
        {
            if (!RuntimeManager.Bind(ProductCode.Engine))
            {
                if (!RuntimeManager.Bind(ProductCode.Desktop))
                {
                    MessageBox.Show("没有安装系统运行所需ArcGis环境!");
                    return;
                }
            }

            IAoInitialize PAoInitialize = new AoInitializeClass();
            PAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);

            //检查主产品的许可是否可用
            if (PAoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeAdvanced) == esriLicenseStatus.esriLicenseAvailable)
                PAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);
            else if (PAoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB) == esriLicenseStatus.esriLicenseAvailable)
                PAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
            else
            {
                MessageBox.Show("ArcGis运行环境没有注册可用的许可!");
                return;
            }

            esriLicenseStatus _LicenseStatus = PAoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine);
            if (_LicenseStatus == esriLicenseStatus.esriLicenseAvailable)
            {
                PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);//3DAnalyst
                PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst); //SpatialAnalyst
            }

            if (PAoInitialize.IsExtensionCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine, esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst) == esriLicenseStatus.esriLicenseUnavailable)
            {
                PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst);
            }

            if (PAoInitialize.IsExtensionCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine, esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst) == esriLicenseStatus.esriLicenseUnavailable)
            {
                PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);

            }
        }

以上代码相当于添加LicenseControl控件,并设置如下属性:

 

后记:用代码初始化许可的话,记得在程序关闭时添加如下代码,否则程序进程在程序关闭后还存在。

public static void ShutDown()
{
         ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown();
         AoInit.Shutdown();  //AoInit为初始化许可时定义的ESRI.ArcGIS.esriSystem.IAoInitialize AoIni 
}

 

补充:

AE 10.1 以后的esriLicenseProductCode

 #region 初始化许可
                    IAoInitialize m_AoInitialize = new AoInitializeClass();
                    esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;
                    licenseStatus = m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);
                    
                    #endregion
[Guid("06870014-A87E-48F0-81E4-41EB502E7470")]
    public enum esriLicenseProductCode
    {
        esriLicenseProductCodeEngine = 10,
        esriLicenseProductCodeEngineGeoDB = 20,
        esriLicenseProductCodeArcServer = 30,
        esriLicenseProductCodeBasic = 40,
        esriLicenseProductCodeStandard = 50,
        esriLicenseProductCodeAdvanced = 60
    }

所有AE10的与AE10.1以后版本的对应关系

esriLicenseProductCodeArcInfo ==》esriLicenseProductCodeAdvanced
esriLicenseProductCodeArcEditor==》esriLicenseProductCodeStandard
esriLicenseProductCodeArcView ==》esriLicenseProductCodeBasic

 

posted @ 2019-05-23 14:51  ParanoiaApe  阅读(881)  评论(0)    收藏  举报