解决ArcObjects10在VB.Net开发中的许可问题

七月 8th, 2011 | by | eis

7月
08

最近在学习ArcGIS开发,使用的开发工具是ArcObjects(AO)和Visual Studio 2010 (VB.Net)。一开始便遇到了头痛的许可(license)问题,解决这个问题花费了我很多力气,主要原因为:

  • ArcGIS从9.x发展到10.0以后,开发许可方式发生了很大变化,在ArcGIS 9.3中,对于所有单机应用程序(stand-alone applications),在运行ArcObjects组件之前,只需对其许可进行初始化。而在ArcGIS 10中有了一个新的要求——runtime绑定。所谓runtime绑定,就是在任何ArcObjects代码(包括许可初始化代码)被执行之前,指定相称的ArcGIS产品——ArcGIS Desktop或者ArcGIS Engine应用程序。
  • 在ArcGIS开发(AO/AE)中的主流语言是C#,使用VB.Net 进行开发的比较少。具体体现为开发中遇到问题时,网上搜索解决方法法时很难找到VB.Net代码,给出的答案大多是C#代码。虽然在Visual Studio的IDE中,二者有很多相通的地方,但考虑到寻找解决方法的大多为初学者,所以C#方案对其帮助有限。

正是基于这两点考虑,我希望这篇文章对在VB.Net下遇到ArcGIS开发许可问题(不仅限于ArcObjects,ArcEngine也适用)感到困惑的同学有所帮助。

1、许可初始化

许可检查可通过以下方法的一种来完成:

  • 直接式:编写AoInitialize代码,一般来说,可以使用ArcGIS许可初始化向导。对于开发者来说,可以使用Visual Studio集成开发环境下的ESRI工具,通过Add ArcGIS License Checking命令可以调用ArcGIS许可初始化向导。
  • 间接式:在Windows窗体上放置一个LicenseControl控件。

第二种方法简单、高效,在这里作主要介绍。

  1. 从【工具箱】中拖放一个LicenseControl控件到Form窗体中。
  2. 右击此控件,选择【属性】。选择应用程序所需的许可
  3. 从中选择你的程序所需要的许可即可。

2、Runtime绑定

如果你仍像是在9.x中一样,以为往windows窗体应用程序中拖了MapControl、TocControl、LicenseControl、ToolbarControl,然后相应地绑定了axMapControl就可以轻松运行程序的话,你会非常沮丧地发现如下提示:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components.

这就是在10.0中新增的对Runtime绑定的要求。

所谓runtime绑定,就是在任何ArcObjects代码(包括许可初始化代码)被执行之前,指定相称的ArcGIS产品(ArcGIS Desktop或者ArcGIS Engine应用程序)。建立runtime绑定的APIs位于程序集ESRI.ArcGIS.Version的类 ESRI.ArcGIS.RuntimeManager中,该程序集随着任何ArcGIS 10 runtime一起安装于全局程序集缓存(Global Assembly Cache (GAC))中。安装了ArcObjects .NET SDK,默认的,程序集ESRI.ArcGIS.Version位于C:Program FilesArcGISDeveloperKit10.0DotNet文件夹下。可以在Visual Studio IDE中将该程序集添加为项目引用。

如果不理解上面这段话,没有关系,这并不妨碍如何解决这个问题。

如果你去Google一下这个错误提示,你多半会得到如下的结果

在系统的入口添加下面的一行代码:

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

当然上面这样代码也可以添加到其他的适合的位置,本人感觉放到程序的入口最合适。

其实,在AO的官方帮助里也可以得到更细致但也不明确的答案

现在的问题是,所谓的“系统入口”在哪里。下面就介绍如何将我们的代码添加到它应在的位置,防止出现各种这位同学所碰到的问题。浏览这个帖子,你会发现最要的问题是找到VB.Net对应于C#的Main函数的位置。

解决问题的具体步骤如下:

  1. 在【解决方案资源管理器】中,右击你的项目名称,选择【属性】。选择项目属性
  2. 再依次选择【应用程序】,点击【查看应用程序事件】按钮。
  3. IDE打开了一个名为“ApplicationEvents.vb”的vb类。
  4. Partial Friend Class MyApplicationEnd Class之间添加代码,最终的“ApplicationEvents.vb”代码如下:
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Namespace My

      ' The following events are available for MyApplication:
      '
      ' Startup: Raised when the application starts, before the startup form is created.
      ' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.
      ' UnhandledException: Raised if the application encounters an unhandled exception.
      ' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
      ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
      Partial Friend Class MyApplication

        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
          '
          ' TODO: Change ArcGIS runtime binding code as needed.
          '
          If Not ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine) Then
            If Not ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop) Then
              MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.")
              e.Cancel = True 'Abort application start up
            End If
          End If
        End Sub

      End Class

    End Namespace

好了,现在开始运行你的程序吧,Just F5!



本文标签: , , , ,

本文基于创作共享的“署名-非商业使用-相同方式分享 2.5”协议发布。

除非注明,本博客文章均为原创,转载请以链接形式标明本文地址。

4 人回应了 “解决ArcObjects10在VB.Net开发中的许可问题”

显示/隐藏评论
  1. lqdniqpl说道:

    终于找到一个高手能解决这问题的了,十分感激

  2. ryanjy说道:

    非常感谢 如文章所述 你解决了很多人不能都不能解决的问题 !

  3. JESS说道:

    非常感谢,按照你的方法,我也成功运行了别的帖子都是随便说一句,没考虑到初学者的痛,哎,说多都是泪呀。

  4. stig说道:

    大神,太感谢了,翻了100多个网页终于找到的会的了。

发表评论

无觅相关文章插件,快速提升流量