目錄
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