目录
1、前言
在网上查询了很多Pro开发的资料,可惜没有找到以Pro定制开发的方式如何形成自己的产品,想要以Pro定制开发的方式形成自己的产品,必须解决配置组织方式、自定义程序集加载、部署发布等问题。
此文解决以下几个问题:
- 如何以自定义配置启动;
- 自定义的插件程序集如何组织存放;
- 怎样部署。
2、自定义项目组成
首先介绍自定义的极简软件系统的组成部分:
- 配置管理模块:配置和开发自定义的启动界面、登录界面等。
- 业务插件模块:自定定制和开发的一些插件功能。
- 公共函数库:封装的一些业务模块调用的公共函数库。
业务模块程序集依赖公共函数程序集:
3、Pro配置组织解析
首先来看看Pro是如何组织他的dll和配置的。
3.1 Bin目录
3.1.1 Bin目录
Bin目录包含:
- 应用程序集和应用程序集配置;
- 核心程序集及依赖的其他程序集:
- Extensions目录:子模块dll及配置存放目录;
- Python目录:Python环境;
- zh-CN目录:存放汉化相关的目录;
等等。
3.1.2 Extentions目录
Exentions存放了Pro所有子模块相关的dll和配置,譬如编辑模块、GP模块等。每个模块文件夹存放模块相关的dll、daml配置以及依赖的dll和配置等。
3.2 自定义程序集位置
我们定制开发时生成的应用程序集Pro是怎么存放的呢?
3.2.1 编译项目时会生成哪些文件?
- 项目生成目录下的文件:
- 此外,在用户的文档目录【C:\Users\Administrator\Documents\ArcGIS\AddIns\ArcGISPro】下也会生成一份ESRI AddinX File文件
3.2.2 启动时读取的插件程序集存放位置
通过ConfigurationManager类的OnUpdateDatabase方法观察Pro启动时读取自定义的dll位置。
Pro运行时经调试发现读取的DLL位置:
【C:\Users\Administrator\AppData\Local\ESRI\ArcGISPro\AssemblyCache】
【C:\Users\Administrator\AppData\Local\ESRI\ArcGISPro\AssemblyCache】目录下的内容:
3.2.3 分析一
删除用户文档目录下的内容,启动Pro会加载自定义的插件模块吗?
结果:
不会加载自定义的插件模块,并清除AssemblyCache目录下的内容。
3.2.4 分析二
删除项目Debug和AssemblyCache目录下的内容,启动Pro会加载自定义的插件模块吗?
结果:
会加载自定义的插件模块,并在AssemblyCache目录下生成程序集信息。
3.2.5 分析三
插件依赖的dll是怎么组织的?
如果将项目的属性的复制到本地属性设置为false,则编译时不会像依赖的dll复制到生成目录,同样也不会嵌入到ESRI AddinX File文件中。启动Pro时会因为缺乏依赖的dll会导致插件功能不能正常使用。
如果将复制到本地设置为true,则会嵌入到ESRI AddinX File文件中。
3.2.6 总结
- ESRI AddinX File文件包含了程序插件相关的配置信息、.dll甚至.pdb文件。
- Pro启动时会读取用户文档目录【C:\Users\Administrator\Documents\ArcGIS\AddIns\ArcGISPro】下ArcGIS的自定义插件信息【ESRI AddinX File文件】,并解析该文件的配置信息,另外以此在目录【C:\Users\Administrator\AppData\Local\ESRI\ArcGISPro\AssemblyCache】下抽取生成DLL。
- Pro启动时加载的程序集位置出来Bin和Extentions目录下的dll外,还会加载目录【C:\Users\Administrator\AppData\Local\ESRI\ArcGISPro\AssemblyCache】下的dll。
- 使用Pro的【ESRI AddinX File文件】定制插件,需要包含依赖的dll。
4、 自定义功能配置组织方案
4.1 自定义启动方式
按以下方式创建自己的快捷方式就可以以自定义的配置方式启动ArcGIS Pro。
- 将配置项目的生成文件拷贝到ArcGIS Pro的bin目录。
- 创建ArcGIS Pro.exe的框架方式,右键属性-快捷方式-目标:设置为以自己定义的配置启动。
4.2 程序集组织
在3.2章节分析了Pro对用户开发的插件的组织方式,但是用于开发产品不适于进行自动化部署,有可能在清理磁盘空间被用户勿删,另外有个更大的问题时如果开发的插件依赖其他的dll,需要把依赖的dll都包含在ESRI AddinX File文件里面,否则程序无法运行,这样会导致发布的文件特别大。
那么我们是否有其他的解决方案去组织自己开发的程序集和配置呢?
4.2.1 Net运行时如何查找程序集
请参阅运行时如何查找程序集。
4.2.2 使用<probing>元素指定程序集位置
使用应用程序配置文件中的<probing>元素来指定运行时在查找程序集时应搜索的子目录。以下示例显示如何指定运行时应搜索的目录。
该privatePath属性包含运行时应搜索程序集的目录。如果应用程序位于C:\ Program Files \ MyApp,则运行时将查找未在C:\ Program Files \ MyApp \ Bin,C:\ Program Files \ MyApp \ Bin2 \ Subbin中指定代码库的程序集,和C:\ Program Files \ MyApp \ Bin3。privatePath中指定的目录必须是应用程序基目录的子目录。
4.2.3 公共的程序集组织方式
- 在bin目录下新建Common文件夹;
- 将公共程序集拷贝都该目录;
- 修改ArcGISPro的应用程序配置文件,将Common目录加入到PrivatePath里面。
4.2.4 参考Pro子模块组织自定义的插件
在Extentions文件夹下新建自定义模块的目录CustomFeatures,将插件相关的dll和daml配置拷贝过去。依赖的程序集放到Bin的子目录Common文件夹下,无需拷贝过来。
5、参考地址:
https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/specify-assembly-location
http://pro.arcgis.com/zh-cn/pro-app/sdk/
https://github.com/esri/arcgis-pro-sdk/wiki/ProSnippets-Framework