ArcMap下拉菜单插件开发全流程:从Add-in配置到部署调试
发布时间:2026/10/6 9:05:47 作者:尧图编辑部 阅读量:1,286

ArcMap的插件开发放到2025年来看多少有点“老古董”的味道。毕竟Esri早就把重心迁到了ArcGIS Pro上ArcMap也进入了维护模式。但现实是国内大量行业用户、科研院所、数据生产单位的生产线还跑在ArcMap 10.x上很多内业工具、流程化操作、地图出图模板都深度绑定了这个老平台不是说换就能换的。在这样一个存量市场里围绕ArcMap做二次开发的需求依然大量存在——做裁剪工具、做图斑检查工具、做图层一键符号化工具、做下拉菜单式的功能集合面板是群里天天有人问的高频问题。这篇文章就聚焦“下拉菜单插件”这一个点完整走一遍ArcGIS Add-in也就是.esriAddIn开发流程。从Add-in方案的选型逻辑讲起到项目工程搭建、config.xml配置、按钮代码实现、编译安装、界面挂载再到调试和常见坑位排查一次性讲透。适合刚接触ArcMap二次开发、或者从老的DLL插件迁移到Add-in的开发者参考里面涉及的环境版本匹配、配置文件名大小写、菜单拖不出来等细节都是实际开发中很容易踩的地雷。1. 为什么还要学ArcMap的Add-in方案选型与现状1.1 从COM插件到Add-inArcMap扩展开发到底经历了什么早期做ArcMap二次开发主流方案是写DLL插件基于ArcObjects SDK通过COM注册机制挂载到ArcMap里。这种方式的痛点很明显最典型的是“DLL地狱”不同插件版本之间的GUID冲突、注册表残留、杀毒软件拦截还有每次改代码要重新注册Com组件、重新启动ArcMap迭代效率低到让人崩溃。而且COM插件的部署基本只能靠安装程序或手动regasm交给非技术用户去装分分钟变成售后现场。Esri从ArcGIS 10.1开始引入了Add-in框架用一份.esriAddIn文件替代了传统的DLLCOM注册流程。Add-in本质上是一个压缩包ZIP格式里面放着程序集、config.xml配置文件、图标、帮助文档等资源。用户拿到这个文件双击即可安装ArcMap通过Add-In Manager统一管理卸载也是一键的事情注册表那些乱七八糟的东西统统不用碰。虽然ArcMap的Add-in框架本身不算新但到今天它依然是ArcMap平台上官方推荐、最省心的扩展方式。1.2 Add-in方案好在哪一张表看清对比很多从老工程转过来的开发者会纠结要不要继续用老的“Base Command”方式。我的建议是除非你的项目还兼容ArcGIS 10.0以下版本否则一律用Add-in。下面这张对比表基本能说明问题对比维度传统DLL/COM插件Add-in插件部署方式手动注册COM组件易残留双击.esriAddIn文件自动安装卸载方式反注册删注册表Add-In Manager一键移除开发模板需手动配置类库引用Visual Studio项目模板直接生成代码组织每功能一个类库繁琐一个工程可包含多个工具、菜单、工具栏配置入口代码硬编码config.xml集中声明UI结构适配版本10.0及更早10.1及以上全部覆盖对非技术用户不友好非常友好简而言之Add-in把“开发”和“界面定义”做了合理分离菜单长什么样、包含哪些按钮、按钮图标是什么在config.xml里声明按钮功能是什么在C#代码类里实现。这种“配置代码”的模式比传统COM插件清晰很多维护起来也舒服。1.3 做一个下拉菜单实际要解决哪些问题把“创建ArcMap下拉菜单插件”这个需求拆开其实包含四个层面的事情工程层面创建Add-in项目配好ArcGIS SDK和.NET环境。配置层面在config.xml里定义菜单结构告诉ArcMap这个菜单叫什么名字、有哪些子项。代码层面实现菜单里每个按钮的点击逻辑让功能真正跑起来。交付层面编译生成.esriAddIn安装进ArcMap并让用户能把它拖到菜单栏/工具栏上。很多人卡住不是卡在写代码上而是卡在“为什么我明明编译成功了ArcMap里却找不到自己做的菜单”这种配置和挂载问题上。这篇文章后面会用大量篇幅把这条链路打通让每个环节都能落地。2. 开发环境准备与工程搭建2.1 环境版本匹配先搞清楚你的ArcMap什么版本ArcMap的Add-in开发和普通.NET开发有一个很大的不同你必须严格匹配ArcMap主版本和Visual Studio、.NET Framework的对应关系。装错了SDK、选错了框架版本轻则编译失败重则插件装了无法加载还没法直接看报错排查起来非常折磨。以最常见的ArcGIS 10.2~10.8为例版本对应关系大致是这样的ArcMap版本对应ArcObjects SDK建议Visual Studio.NET Framework注意点10.1 / 10.2ArcObjects SDK for .NET 10.1/10.2VS2010/VS2012.NET Framework 3.5/4.0SDK 10.2支持VS201210.3 / 10.4ArcObjects SDK for .NET 10.3/10.4VS2012/VS2013.NET Framework 3.5/4.5从VS2013开始集成10.5 / 10.6ArcObjects SDK for .NET 10.5/10.6VS2013/VS2015.NET Framework 4.5/4.6模板安装后需手动启用10.7 / 10.8ArcObjects SDK for .NET 10.7/10.8VS2015/VS2017/VS2019.NET Framework 4.5.2以上建议用VS2017或VS2019这里补充一个很多人不知道的细节ArcObjects SDK for .NET的安装不一定必须先装Visual Studio。但如果你先装SDK再装VSSDK里的项目模板可能不会出现在VS里因为模板注册的时机错过了。最稳妥的操作顺序是先装Visual Studio再装ArcGIS Desktop也就是ArcMap本体最后装ArcObjects SDK。如果顺序乱了模板不出现可以在SDK安装目录里找到模板压缩包手动复制到VS的项目模板目录但那是比较折腾的做法不推荐。2.2 创建Add-in项目的标准步骤环境装齐后打开Visual Studio新建项目在模板里找到“ArcGIS”分类选择“ArcGIS Add-In”项目类型不同版本SDK下名称略有差异有的叫“ArcGIS Desktop Add-In”。项目会默认生成如下内容config.xml插件的UI配置清单核心中的核心。一个或多个.cs文件每个按钮、工具、菜单项的逻辑类。Images文件夹存放图标资源。一个ESRI.ArcGIS.AddIn.xml或类似名称的构建配置文件部分SDK版本中叫“AddIn”文件夹下的配置文件。我在实际项目里一般会把工程名取得有辨识度一点比如“MyArcMapMenus”这样生成的.esriAddIn文件名也是“MyArcMapMenus.esriAddIn”分发出去同事一眼就知道是什么工具。项目建好后先编译一次确认模板默认生成的代码能编译通过再动手改配置。提示如果新建项目时在模板列表里找不到ArcGIS Add-In模板大概率是SDK没安装成功或者安装顺序有问题。可以先打开“控制面板-程序和功能”确认“ArcObjects SDK for .NET”是否在列表里如果没装重新运行ArcGIS Desktop安装介质找到SDK组件单独安装。不要试图跳过SDK只写代码Add-in项目模板依赖它。2.3 项目结构体检config.xml决定了插件边界新建出来的项目里config.xml是最需要仔细看的文件。Add-in安装时ArcMap会读这个文件来决定你插件里有哪些控件、控件出现在哪里、点击后执行哪个类。可以这么说你改了config.xml的标签等于改了插件的边界。项目刚生成时config.xml里会有一段默认内容大致包含AddIn NameMyArcMapMenus/Name Description.../Description Version1.0/Version Publisher.../Publisher AssemblyNameMyArcMapMenus.dll/AssemblyName ImagePathImages/ImagePath ArcMap Commands Button idMyArcMapMenus_Button1 classButton1 imageImages/button1.png caption按钮一 category菜单测试 message提示信息 tip悬停提示 /Button /Commands Menus Menu idMyArcMapMenus_Menu1 caption我的下拉菜单 category菜单测试 Item refIDMyArcMapMenus_Button1 / /Menu /Menus /ArcMap /AddIn理解这份结构的关键在于Commands区域声明“有哪些可用的命令”Menus区域声明“命令怎么组织成菜单”。下拉菜单的本质就是在Menus里声明一个Menu节点然后用Item refID把按钮引进来。这个思路和ArcGIS Pro的DAML配置有点像但语法完全不同千万别混着抄。3. 核心实现下拉菜单的配置文件与代码3.1 config.xml里怎么定义一个真正的下拉菜单直接给一份能用的config.xml示例。这个例子做了三层效果顶层菜单叫“数据检查工具”里面放了两个功能按钮——“检查尖锐角”和“删除空图层”还加了一个分隔线再放一个“退出工具”按钮。分隔线在Add-in配置里用Separator /表示这个细节很多人不知道?xml version1.0 encodingutf-8? AddIn NameDataCheckTools/Name Description用于数据质量检查的ArcMap插件/Description Version1.0.0/Version PublisherYourName/Publisher AssemblyNameDataCheckTools.dll/AssemblyName ImagePathImages/ImagePath ArcMap Commands Button idDataCheckTools_CheckSharpAngle classCheckSharpAngle imageImages/sharp_angle.png caption检查尖锐角 category数据检查 message检查当前图层中的尖锐角 tip点击运行尖锐角检查 /Button Button idDataCheckTools_DeleteEmptyLayer classDeleteEmptyLayer imageImages/delete_layer.png caption删除空图层 category数据检查 message删除文档中的空图层 tip点击删除空图层 /Button Button idDataCheckTools_ExitTool classExitTool image caption退出工具 category数据检查 message退出工具集 tip退出当前菜单工具集 /Button /Commands Menus Menu idDataCheckTools_MainMenu caption数据检查工具 category数据检查 Item refIDDataCheckTools_CheckSharpAngle / Item refIDDataCheckTools_DeleteEmptyLayer / Separator / Item refIDDataCheckTools_ExitTool / /Menu /Menus /ArcMap /AddIn配置里出现的所有id和class是对应的。classCheckSharpAngle意味着代码里要有一个类名叫CheckSharpAngle。id是整个Add-in包内的唯一标识建议用“项目名_功能名”的命名方式避免和其他插件冲突。ArcMap加载多个Add-in时如果两个插件的id重复其中一个会加载失败这种问题很隐蔽别等装了同事的插件才发现。还有一点必须提醒config.xml的编码建议保持UTF-8。如果你在文件里写了中文caption比如“数据检查工具”但文件另存成了ANSI或GB2312ArcMap读取时可能乱码。Visual Studio里的XML文件默认UTF-8问题不大但如果你从网站复制代码或者用别的编辑器改过文件保存时记得检查编码。3.2 按钮类怎么写OnClick里的ArcMap对象访问config.xml只是搭好了壳按钮点了之后干什么得靠代码类实现。每一个Button对应的类继承自ESRI.ArcGIS.Desktop.AddIns.Button基类重写OnClick()方法即可。下面是一个“检查尖锐角”按钮的完整代码示例using System; using System.Windows.Forms; using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Desktop.AddIns; namespace DataCheckTools { public class CheckSharpAngle : Button { public CheckSharpAngle() { } protected override void OnClick() { try { // 拿到ArcMap当前文档和地图 IMxDocument mxDoc (IMxDocument)ArcMap.Application.Document; IMap map mxDoc.FocusMap; // 遍历当前图层找到第一个要素图层 IFeatureLayer featureLayer null; for (int i 0; i map.LayerCount; i) { if (map.get_Layer(i) is IFeatureLayer) { featureLayer (IFeatureLayer)map.get_Layer(i); break; } } if (featureLayer null) { MessageBox.Show(当前地图中没有要素图层请先添加图层。, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } int sharpAngleCount CountSharpAngles(featureLayer.FeatureClass); MessageBox.Show(string.Format(在当前图层中检查到 {0} 个尖锐角。, sharpAngleCount), 检查结果, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show(检查过程出错 ex.Message, 错误, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private int CountSharpAngles(IFeatureClass featureClass) { int count 0; // 这里以多边形图层为例通过拓扑接口遍历每个要素的折点角度 IFeatureCursor cursor featureClass.Search(null, false); IFeature feature null; while ((feature cursor.NextFeature()) ! null) { IGeometry geometry feature.Shape; if (geometry.GeometryType ! esriGeometryType.esriGeometryPolygon) { continue; } // 对每个多边形跑一次“角度检查”逻辑 // 这里简化处理把每个要素的拐角小于阈值的视为尖锐角 // 真实项目中建议用ITopologicalOperator或自定义几何计算 if (HasSharpAngle(geometry)) { count; } } return count; } private bool HasSharpAngle(IGeometry geometry) { // 核心几何算法遍历顶点计算相邻向量夹角 // 小于阈值(这里取10度)即判定为尖锐角 // 具体实现可参考ArcObjects线段角度计算 return false; } protected override void OnUpdate() { // 是否需要灰掉按钮 Enabled ArcMap.Application ! null; } } }这里最值得关注的是ArcMap.Application.Document这一串访问逻辑。在Add-in代码里ArcMap的主对象是通过ArcMap.Application这个静态属性暴露出来的拿到IMxDocument之后就等于拿到了当前地图文档的“命脉”——你可以访问当前焦点地图、图层集合、选择集、布局视图进一步甚至可以做图层符号化、属性查询、要素操作。这套对象模型和传统AO开发完全一致所以看过ArcObjects的人写Add-in代码不会有障碍。3.3 菜单项的启停控制、图标和快捷键在Add-in的Button类里除了OnClick()还有一个高频使用的覆写方法OnUpdate()。ArcMap在空闲时会反复调用这个方法来刷新每个按钮的可用状态。如果OnUpdate()里设置Enabled true按钮就一直可点如果某些条件下需要让按钮灰掉就设Enabled false。比如“删除空图层”这个按钮如果当前地图里根本没有空图层就可以在OnUpdate()里先遍历一遍图层没有空图层就把按钮置灰用户体验会好很多。图标这块有个坑。config.xml里的image属性路径是相对于项目根目录的。如果你在Images文件夹里放了icon.png那就写成imageImages/icon.png。但注意Add-in的图标尺寸建议用16x16像素格式一般用png或bmp。我遇到过同事传了一个32x32的ICON格式图标编译安装后按钮上什么都不显示折腾了半天才发现是格式不兼容。快捷键的配置不在config.xml里而是在按钮类里覆写OnKeyDown或者利用ArcMap自带的快捷键管理。其实大部分下拉菜单里的工具用不到快捷键但如果你做一个“全屏截图出图”这类高频操作可以考虑在后面给用户配置一个快捷键代码里在OnClick()外再处理。不过这个是加分项第一版不必急着做。4. 编译、安装、调试与分发把菜单真正挂到界面上4.1 编译生成.esriAddIn文件在Visual Studio里右键项目选择“生成”。正常编译通过后在输出目录bin/Debug或bin/Release下会生成一个以项目名命名的.esriAddIn文件。这个文件就是最终交付物。它实际上是一个ZIP压缩包你甚至可以把后缀改成.zip打开看里面的结构一般会有一个.dll文件你写的程序集config.xmlImages文件夹可能还有license文件或帮助文档在安装之前建议先在Release模式下重新编译一次再分发。Debug模式下生成的程序集依赖调试符号别人装上如果没装对应的.NET环境可能跑不起来。虽然大多数情况下没太大区别但作为交付习惯Release是必须的。4.2 双击安装与权限注意拿到.esriAddIn文件双击ArcMap会弹出Add-In Manager窗口显示插件信息并提示安装。安装完成后理论上这个插件就“注册”到当前用户了。安装位置通常是C:\Users\用户名\Documents\ArcGIS\AddIns\Desktop10.x\不同ArcMap版本对应Desktop10.x目录不同比如10.2对应Desktop10.210.8对应Desktop10.8。如果你的ArcMap不是以当前Windows用户安装的或者当前用户的“我的文档”被重定向过安装路径会有变化。这是为什么很多时候双击安装后换一个系统用户登录ArcMap就看不到插件的原因。安装本身一般不需要管理员权限因为安装位置在用户目录下。但如果策略限制用户写入Documents目录或者IT部门做了文件夹重定向也可能装不上。企业环境下建议先在一台机器测试典型用户权限场景。4.3 界面挂载为什么我装了插件却找不到菜单这是Add-in开发里最最最常见的问题也是每个新人几乎必踩的坑。安装插件后打开ArcMap你会发现菜单栏上并没有出现你定义的“数据检查工具”下拉菜单。你以为插件没生效其实插件已经加载了只是ArcMap默认不会把新插件的菜单自动放到菜单栏上——需要手动挂载。操作路径是点击菜单栏“自定义”→“自定义模式”在弹出的“自定义”对话框中切到“命令”选项卡在左侧“类别”列表里找到“Add-In Controls”或者你在config.xml里定义的category名称比如“数据检查”右侧会列出你这个插件里定义的所有命令和菜单。然后直接把“数据检查工具”这个菜单项拖拽到ArcMap的菜单栏就是和“文件”“编辑”“视图”同一排的那个区域松手后关闭自定义对话框菜单栏上就会出现你的下拉菜单了。记住这个关键操作Add-in里的菜单默认不会自动出现必须手动拖拽才能挂到界面上。这个机制让很多刚上手的人误以为“插件开发失败了”。如果你想省去手动拖拽这一步也可以写代码在插件加载时自动添加菜单到IToolbar但那种做法涉及ArcMap的界面定制接口复杂度高一般建议第一版不碰先让用户手动拖一次后面ArcMap会记住这个布局。4.4 调试技巧附加进程和重新构建开发过程中最忌讳的是每次改代码就重装一次Add-in、重启一次ArcMap。正确的调试模式是先启动ArcMap不用装最新版插件也没关系先让ArcMap跑起来然后在Visual Studio里点击“调试”→“附加到进程”在进程列表里选ArcMap.exe点“附加”然后在代码里打上断点回到ArcMap点击你的菜单按钮断点就会命中。需要注意如果你改了代码光“附加进程”不够需要先在VS里重新生成项目生成的同时ArcMap里的Add-in不会自动更新。你需要在Add-In Manager里先禁用/移除旧版本插件重新双击新的.esriAddIn安装然后再到ArcMap里把菜单重新拖出来或者至少确认旧菜单还挂在界面上。这也是为什么我会在调试阶段把“手动拖拽”这个步骤反复练熟因为每次重装都要来一遍。调试时还有个体验优化给OnClick()方法里多写几个MessageBox.Show()临时输出中间变量虽然看起来不够“优雅”但是在ArcMap这种桌面环境里其实很高效。你可以快速看到哪个环节数据不对定位再精准改断点。等调试通过后再把这些临时代码清理掉。4.5 分发注意点版本、许可、签名把做好的.esriAddIn文件发给其他人时有几个硬性要求对方的ArcMap版本必须和你开发时用的主版本一致。10.2的Add-in不能装在10.5上引擎会直接判定无效10.5的也不能装在10.2上。如果需要跨版本支持必须针对每个ArcMap版本分别编译发布。对方的ArcMap许可级别不能低于你开发测试的许可级别。如果你用ArcInfo许可开发对方是ArcView许可部分ArcObjects功能会受限插件可能加载失败或运行时报许可错误。如果你在代码里引用了第三方库记得把依赖的dll一起放进Add-in包里或者确保对方机器装了对应运行时。最常见的是引用Newtonsoft.Json这类库漏了就等着对方跑起来报“找不到程序集”吧。另外要格外小心不要把“ArcGIS许可服务启动不了”这类环境问题和插件问题混在一起排查。很多用户反馈“装了插件以后ArcMap打不开了”结果一看是License Server没启动或者端口被占跟你的插件半毛钱关系都没有。遇到这类问题优先检查Windows服务里ArcGIS License Manager的状态再检查插件。5. 常见问题速查与独家避坑心得5.1 高频问题排查表问题现象可能原因排查方法编译报“找不到ESRI.ArcGIS.Desktop.AddIns”ArcObjects SDK没装好或项目目标框架不匹配确认SDK版本SDK与VS版本匹配重新安装SDK生成的.esriAddIn双击没反应文件关联丢失或被安全软件拦截尝试改后缀为.zip看内容重新关联Add-In文件类型检查Add-In Manager里是否有错误记录安装了插件但ArcMap菜单栏没有菜单未手动拖拽挂载打开“自定义”→“自定义模式”→“命令”→Add-In Controls把菜单拖到菜单栏菜单显示出来但按钮是灰色OnUpdate里Enabled设置不对检查OnUpdate覆写如果没覆写OnUpdate基类默认可点击按钮点击没反应事件没挂上或OnClick里异常被吞在OnClick里加上try-catch弹MessageBox看异常中文caption乱码config.xml编码不是UTF-8用记事本/VS另存为UTF-8编码图标不显示图片格式或尺寸不对用16x16 PNG检查image路径大小写插件在别人机器上加载失败版本不匹配/缺依赖dll/许可不足确认ArcMap版本检查第三方引用确认许可级别每次改代码都要重装很烦没有用附加进程调试VS里“调试”→“附加到进程”选择ArcMap.exe5.2 几条我反复踩过之后的体会第一config.xml里的标签大小写和层级非常敏感。Menus下面直接写Menu是对的但很多人会不小心写成Menu外面再加一层Toolbar导致ArcMap根本不识别。Add-in的配置不是HTML浏览器能容忍错标签但ArcMap不能。我的习惯是新建项目后先保留模板生成的config.xml不动用“复制-修改”的方式来加新菜单这样至少结构不会错。第二开发机上最好用和客户一致的ArcMap版本。我以前觉得10.4和10.6差不多结果编译一次、装到客户10.4上直接报“此扩展模块与此版本不兼容”。里面有相当严格的程序集强名称校验版本不一致就加载不出来。如果你实在要覆盖多个版本给每个版本建一个独立分支或供构建配置分别编译生成不要图省事一个版本走天下。第三Add-in项目里不要手动引用ArcMap.exe来做互操作要引用ESRI.ArcGIS命名空间下的官方程序集。新手在写代码时最容易图省事右键添加引用找ArcMap.exe编译有时能过但运行时会极不稳定尤其是多版本共存时程序集绑定乱成一团。正确做法是通过SDK安装好的ESRI.ArcGIS.*系列dll并且把Copy Local设为false反正ArcMap运行时自己有这些组件。第四ArcMap里Add-in加载的状态可以在Add-In Manager里查看。不管插件列表里显示“Enabled/Disabled”只要插件出现在列表里就说明框架已经识别到你了问题往往出在config.xml或代码运行时的异常上。这是一个很实用的排查思路能帮你在“加载失败”和“运行异常”之间快速分流。第五调试期间建议在catch (Exception ex)里把异常信息写到本地日志文件比如C:\Temp\MyAddinLog.txt而不是只弹MessageBox。因为在ArcMap的事件环境里某些异常弹窗并不会展示完整的堆栈信息写了日志能省去很多反复试错的时间。5.3 还有一个隐藏很深的坑系统用户目录Add-in是按用户安装的这一点前面提过但这里再展开一次。如果你给公司做了一套工具部署到每一台电脑上时是用管理员账号登录安装的但同事平时办公用的是域账号或者普通账号那就可能出现“这台电脑装了但同事登录进去还是看不到插件”的情况。解决方案不是在每台机器上切换账号装一遍而是可以把.esriAddIn文件发下去让大家在自己账号下双击安装一次或者在安装脚本里针对不同用户目录分别写入。别以为装了电脑就等于装了插件这个认知必须纠正。6. 从ArcMap到ArcGIS Pro一点题外话看到这里你大概已经把ArcMap的Add-in下拉菜单跑通了。说实话如果你的项目是全新的、未来还要长期维护我个人建议你把目光放到ArcGIS Pro上Pro的Add-in框架比ArcMap更现代UI定义改成了DAMLDesktop Add-in Markup Language虽然语法变了但“配置文件声明UI代码实现逻辑”这个思想是一脉相承的。迁移代码时ArcObjects的很多接口在Pro里改成了ArcGIS.Core的接口不能直接照搬但业务逻辑的思路是可以复用的。不过话说回来在那些存量ArcMap环境里写一个下班前能交付的小工具插件、做一个包含十几个常用操作的下拉菜单给数据组的同事省下大量重复劳动这件事本身依然非常值。尤其在国内大量生产环境还停留在ArcMap的现实下这个技能短期内不会没有用武之地。最后分享一个我个人的操作习惯每次写完一个Add-in我会专门花两分钟做一份“一键安装说明.txt”里面写清楚三件事——第一双击安装之前先关闭ArcMap第二安装后在“自定义→自定义模式→命令”里把菜单拖出来第三插件崩溃时先去Add-In Manager里禁用再启用。文件不长但能让同事少找你三回。做GIS二次开发很多时候交付的不仅仅是代码还有让不懂开发的人也能用起来的耐心和方法。