☰
ArcGIS Engine 10 应用打包与部署:Runtime 依赖与安装包制作全攻略
2026/10/29 20:07:57 网站建设 项目流程

简介:这份资源面向使用 ArcGIS Engine 进行桌面 GIS 二次开发的程序员,聚焦应用程序发布环节的打包难题,帮助开发者把自研的 AE 程序连同运行环境一并交付给最终用户。压缩包内为 1 个 docx 文档,体积约 2.24MB,内容围绕 .NET Framework 3.5 SP1 与 ArcGIS Engine Runtime 的单独安装、联合打包两条路线展开,并涉及 Visual Studio 2008 安装项目与 InstallShield 两种打包工具的使用。文档还专门整理了打包过程中容易遇到的两个典型问题,对 Esri 依赖库的排除处理、快捷方式与安装目录的配置等细节均有说明,可作为发布阶段的对照手册。目前已有 654 人学习,适合需要完成 AE 程序部署、减少用户环境配置障碍的中级开发者参考。

1. 打包 ArcGIS Engine 应用:从 Runtime 依赖到 Setup 工程,一次装通不返工

接手一个 ArcGIS Engine 桌面项目时,最容易翻车的不是代码,而是交付。开发机上跑得好好的程序,拷到客户机器上双击就报“找不到 Esri.ArcGIS.Runtime 相关程序集”,或者干脆弹一个授权初始化失败。这类问题十有八九不是程序写错了,而是打包时把 Runtime 的 DLL 一起塞进了安装包,或者漏装了 .NET Framework 3.5 SP1。ArcGIS Engine 10 这套环境对依赖版本相当敏感,Runtime 必须单独授权安装,应用程序只带自己的主输出,两者边界一旦搞混,装十台机器能坏八台。这篇笔记面向正在做 AE 桌面程序交付的开发者,把“Runtime 单独装”和“Runtime 与框架一起打包”两条路线拆开讲清楚,顺带把 InstallShield 里那些容易点错的参数和装坏后的补救办法一并记下来。

2. 环境先列清:AE 10 Runtime 与 .NET 3.5 SP1 的版本账

动手建安装工程之前,先把目标机器上必须存在的东西列成一张清单。ArcGIS Engine 应用程序不是绿色软件,它依赖两个外部组件:.NET Framework 3.5 SP1 和 ArcGIS Engine 10 Runtime。前者提供 CLR 运行环境,后者提供 Esri 的 COM 组件和托管程序集,并且 Runtime 安装完成后还需要做一次授权初始化,否则程序启动时会在许可检查那一步直接退出。很多人以为把 Esri 的 DLL 复制到输出目录就能免装 Runtime,这是最常见的误解,后面避坑章节会专门说。

2.1 组件清单与版本对应关系

先把这张表存下来,交付前逐项核对,比装完再排查省事得多。

组件版本要求安装方式是否需授权备注
.NET Framework3.5 SP1系统组件安装包否Win10 及以上需在“启用或关闭 Windows 功能”中勾选
ArcGIS Engine Runtime10独立安装包是必须与开发所用 SDK 大版本一致
应用程序主输出项目自身Setup 工程打包否只含 exe 与自有 DLL
Esri 依赖 DLL随 Runtime不打包否由 Runtime 安装目录提供

版本对应关系上,开发机用 Engine 10 的 SDK,目标机就必须装 Engine 10 的 Runtime,不能拿 10.1 的 Runtime 去跑 10.0 编译出来的程序,反过来也一样。常见做法是交付前在干净虚拟机上先手动装一遍 Runtime,确认授权管理器能正常初始化,再去做安装包。这一步看着笨,但能提前暴露授权文件缺失、系统缺少 VC 运行库这类问题。

2.2 开发机与目标机的环境对照

开发机通常已经装了完整的 ArcGIS Desktop 或 Engine SDK,Runtime 是随 SDK 一起带进来的,所以本机测试永远发现不了依赖缺失。目标机则是一张白纸,只有操作系统。我一般会准备一台只装操作系统的虚拟机作为“交付靶机”,所有安装包先在这台机器上跑一遍。对照时重点看三处:注册表里HKEY_LOCAL_MACHINE\SOFTWARE\ESRI下是否有 Engine 项、系统目录里是否存在msvcr71.dll这类 VC 运行库、以及 .NET 3.5 功能是否已启用。这三项任一缺失,安装程序即使跑完,应用启动也会失败。

提示:Win10 之后 .NET 3.5 默认不启用,安装包若直接调用 3.5 的安装程序会提示需要联网下载。离线交付场景下,提前把 3.5 SP1 的离线安装源准备好,或者改用系统功能启用的方式处理。

3. 路线一:Runtime 单独安装,VS 2008 建 Setup 工程

这条路线适合客户机器已经统一装好 Runtime 的场景,比如企业内部批量部署,IT 部门先推一遍 Runtime,再分发应用程序。好处是安装包小、构建快,坏处是对目标机的前置条件要求高,漏装 Runtime 就直接白屏。用 Visual Studio 2008 自带的安装和部署项目就能完成,不需要额外买打包工具。

3.1 新建 Setup 工程并挂接主输出

在现有解决方案里右键“添加 → 新建项目”,左侧节点找到“其他项目类型 → 安装和部署 → Visual Studio Installer”,选“安装项目”,命名为 Setup。建好后会自动打开文件系统编辑器,在“应用程序文件夹”上右键“添加 → 项目输出”,项目选你的 Engine 应用程序,输出组选“主输出”。

# 说明:这一步在 VS 界面完成,无命令行;若用 msbuild 构建,命令如下 msbuild Setup.vdproj /p:Configuration=Release /p:Platform="x86"

构建命令里Platform必须与主程序的平台目标一致,AE 10 的托管程序集是 32 位的,主程序若编译成 AnyCPU 在 64 位系统上会以 64 位进程启动,加载 32 位 Esri DLL 时直接抛BadImageFormatException。我一般把主程序和 Setup 工程都固定为 x86,省得后面查半天。

添加主输出后,文件系统编辑器里会冒出一大堆 Esri.ArcGIS.*.dll。这些 DLL 是 VS 根据引用自动带进来的,但目标机上 Runtime 安装目录里已经有同一批文件,重复打包不仅让安装包膨胀,还可能因为版本不一致覆盖掉 Runtime 自带的文件,导致授权组件加载失败。

3.2 排除 Esri 依赖 DLL 与创建快捷方式

在 Setup 工程的“检测到的依赖项”里,把 Esri 开头的项逐个右键“排除”。排除的依据很简单:这些程序集由 Runtime 提供,安装包只负责应用程序自己的 exe 和业务 DLL。排除完再检查一遍文件系统编辑器,确认应用程序文件夹里只剩 exe 和自有组件。

接着在主输出上右键“创建快捷方式”,重命名为应用名,把快捷方式拖到“用户的桌面”和“用户的程序菜单”两个目录。两个位置各放一份是常见做法,桌面方便启动,程序菜单方便卸载入口被系统收录。快捷方式的 Target 属性保持默认指向主输出即可,不需要手写路径。

<!-- Setup 工程关键属性示意,实际在 .vdproj 中体现 --> <Property Name="ProductName" Value="模拟项目X" /> <Property Name="Manufacturer" Value="某实验室" /> <Property Name="Version" Value="1.0.0" /> <Property Name="TargetPlatform" Value="x86" />

ProductName会出现在控制面板的卸载列表里,Version决定升级安装时的覆盖行为,TargetPlatform必须与主程序一致。这三项写错,轻则卸载列表里名字乱码,重则升级安装时旧版本卸不掉。

3.3 生成 MSI 与 EXE 并做首次安装验证

右键 Setup 工程“生成”,输出目录下会得到Setup.msi和setup.exe两个文件。msi 用于组策略或静默分发,setup.exe 用于手动双击。首次验证一定要在靶机上进行,顺序是:先确认 .NET 3.5 SP1 已启用,再手动装 Runtime 并完成授权,最后双击 setup.exe 安装应用。

安装完成后从桌面快捷方式启动,如果程序能正常打开主界面并完成一次地图加载,说明依赖链是通的。若启动时报“无法加载 DLL Esri.ArcGIS.Version”,回到靶机检查 Runtime 是否真的装到了默认路径,以及安装时是否用了管理员权限。授权失败则打开 Runtime 自带的授权初始化工具重新配置,不要试图在应用里绕过许可检查。

4. 路线二:InstallShield 把 Runtime 与 .NET 一起打包

客户机器完全裸机、又不允许 IT 预装组件时,就得走一体化打包。工具选 InstallShield,它能把 .NET 3.5 SP1 的先决条件和 ArcGIS Engine Runtime 的安装文件一起塞进安装包,用户双击一次全部装完。代价是工程配置复杂,Project Assistant 向导只能覆盖简单场景,真正要控制安装顺序和条件判断,还得切到 Installation Designer。

4.1 新建工程与 Project Assistant 基础信息

新建 InstallShield 工程,类型选 Basic MSI,填好工程名和路径。建完进入 Project Assistant,按向导填 Application Information:应用名、公司名、版本号、安装语言。这些信息会写进 MSI 的属性表,卸载时显示的就是这里填的名字。

下一步的 Installation Architecture 直接默认即可,AE 应用是 32 位,选 x86 架构。再下一步 Application Files 可以先跳过,因为向导里添加文件的方式不够灵活,我一般直接切到 Installation Designer 的 Files and Folders 视图操作。

4.2 Files and Folders 里放主程序与 Runtime 目录

在 Installation Designer 左侧点开 Files and Folders,上方是 Source computer's folders(本机目录),下方是 Destination computer's folders(目标机目录)。把主程序输出目录从上方拖到下方的 Application Target Folder,然后在 Application Target Folder 上右键新建一个 temp 目录,把 ArcGIS Engine 10 的 Runtime 安装目录整体拖进 temp。

# Runtime 目录结构核对,打包前确认授权文件在位 ls "ArcEngine10/" # 期望看到:setup.exe License Bin ... 以及授权初始化相关文件

temp 目录的作用是让 Runtime 的安装文件随包携带,安装时由自定义动作调用 temp 里的 setup.exe 完成静默安装。目录里必须包含授权文件,否则 Runtime 装完也无法初始化。打包前用上面这条命令核对一遍,缺文件就补,别等装到客户机上才发现。

4.3 快捷方式、先决条件与安装顺序

切回 Project Assistant 的 Shortcuts 步骤,点 New 选择主 exe,把默认的launch xxx.exe改成正式应用名。再到 Installation Designer 的 Shortcuts 视图微调,确认桌面和开始菜单两处都指向正确目标。

先决条件在 Redistributables 视图配置,把 .NET Framework 3.5 SP1 勾上,InstallShield 会在安装前检测并触发框架安装。Runtime 的安装则通过 Custom Actions 实现:在 InstallExecuteSequence 里加一个自定义动作,类型选“启动 exe”,指向[TempFolder]temp\setup.exe,执行时机放在 InstallFiles 之后、InstallFinalize 之前,并设置返回码 3010 视为成功(表示需要重启)。

<!-- Custom Action 关键参数示意 --> <CustomAction Id="InstallAERuntime" FileKey="RuntimeSetup" ExeCommand="/s /v/qn" Execute="deferred" Impersonate="no" Return="check" />

/s /v/qn是 Runtime 安装程序的静默参数,Execute="deferred"保证在系统上下文执行,Impersonate="no"让它以提升权限运行。返回码处理上,3010 要单独放行,否则安装程序会把“需要重启”误判为失败并回滚。

5. 避坑与排查:打包环节最容易翻车的五处

5.1 现象:安装包体积异常大,装完 Runtime 反而失效

原因:Setup 工程没有排除 Esri 的 DLL,安装包把 Runtime 自带的程序集又覆盖了一遍,版本不一致导致授权组件加载失败。解决:回到文件系统编辑器,把 Esri 开头的依赖项全部排除,重新生成后在靶机上先卸旧版再装新版验证。

5.2 现象:程序启动报 BadImageFormatException

原因:主程序编译为 AnyCPU,在 64 位系统上以 64 位进程运行,加载 32 位 Esri 程序集失败。解决:主程序和 Setup 工程的平台目标统一改为 x86,重新编译打包。这个坑在开发机上往往复现不了,因为开发机可能装了 32 位运行时环境。

5.3 现象:一体化安装包跑到一半回滚

原因:Runtime 的 Custom Action 返回码没处理 3010,安装程序把“需要重启”当成失败。解决:在 Custom Action 的返回码配置里把 3010 加入成功列表,或者改用Return="asyncNoWait"并配合重启提示。

5.4 现象:目标机提示缺少 .NET 3.5,但安装包已勾选先决条件

原因:离线环境下先决条件安装程序尝试联网下载失败。解决:把 3.5 SP1 的离线安装源随包携带,在 Redistributables 里指定本地路径,或改用系统功能启用的命令行方式处理。

5.5 现象:快捷方式指向错误,双击打开的是安装程序

原因:Shortcuts 视图里 Target 误选成了 setup.exe 而非主程序 exe。解决:逐个检查桌面和开始菜单快捷方式的 Target 属性,确认指向 Application Target Folder 下的主 exe。

6. 装完怎么验证:三步确认依赖链真的通了

安装包生成只是开始,能不能在干净机器上跑通才是交付标准。我的验证习惯分三步,每步都有明确的通过条件,任何一步不过就回到对应章节查。

第一步,靶机裸装验证。准备一台只装操作系统的虚拟机,不预装任何组件,直接双击安装包。通过条件:安装过程无回滚、无报错弹窗,安装结束后控制面板卸载列表里能看到应用名。这一步主要验证先决条件和 Runtime 的安装顺序是否正确。

第二步,授权与启动验证。从桌面快捷方式启动应用,观察是否能进入主界面。通过条件:主界面正常渲染,执行一次地图加载或图层查询不报许可错误。若卡在许可检查,打开 Runtime 授权工具重新初始化,再启动一次。这一步验证的是 Runtime 授权文件是否随包正确落地。

第三步,卸载与重装验证。在控制面板卸载应用,确认程序目录和快捷方式被清理干净,然后重新安装一次。通过条件:重装后应用仍能正常启动,且卸载没有残留导致第二次安装失败。这一步能暴露 MSI 组件引用计数和自定义动作清理不彻底的问题。

# 靶机上快速核对 Runtime 注册项是否存在 reg query "HKLM\SOFTWARE\ESRI\ArcGIS Engine" /s # 有输出且版本号为 10.x 即视为 Runtime 注册正常

这条注册表查询是我每次交付前必跑的,比翻安装日志快。输出为空说明 Runtime 根本没装上,输出版本号对不上说明装错了大版本,两种情况都得回炉。

从那以后我每次打完包,都强制在裸机虚拟机上走一遍“装、启、卸、再装”四步,不跳步、不图省事。血泪经验是,开发机上一切正常不代表交付包没问题,依赖这东西只有放到白纸上才看得清。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询