Надстройка ArcMap с app.settings не распознает изменения app.config?

14

Я разработал надстройку ArcMap, для которой требуется файл конфигурации. Потратив некоторое время, пытаясь прочитать значения конфигурации из одного файла App.Config (и всегда получая значение NULL), я считаю, что надстройка не может читать значения отсюда, поскольку это библиотека классов, и ищет вызывающее приложение (ArcMap) Конфигурационный файл, когда я спрашиваю значение ключа (отсюда ноль).

Чтобы обойти это, я использовал файл App.Settings, который приложение может читать хорошо. Создание этого также вводит файл App.Config в среду, и Visual Studio поддерживает синхронизацию этих двух файлов во время разработки.

Теперь, когда надстройка развернута, мне нужно иметь возможность изменять значения конфигурации (например, местоположение файла журнала). Я попытался открыть / извлечь файл .esriaddin и обновить там файл App.Config, но надстройка сохраняет те же значения конфигурации, которые были при компиляции. Я знаю, что новые значения App.Config сохраняются в файле .esriaddin, потому что я могу просмотреть их снова после закрытия архива.

Кто-нибудь знает надежный способ настроить надстройку и разрешить обновление этой конфигурации после развертывания? Любые предложения очень приветствуются, так как кажется смешным, что для этого мне нужен специальный файл конфигурации.

Значения App.Settings находятся на уровне приложения, и в настоящее время и App.Settings, и App.Config имеют действие сборки: нет / не копировать.

tomfumb
источник

Ответы:

8

Я разобрался, как настроить надстройку.

Файл надстройки в ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... расширяется при каждой загрузке ArcMap, поэтому единственное место, где можно редактировать ЛЮБЫЕ файлы конфигурации, встроенные в надстройку, - это здесь. Я не экспериментировал с использованием ключей реестра или выделенного каталога конфигурации надстройки, так как это казалось излишним.

В конце я использовал файл app.config (потому что даже если он используется с библиотекой классов, которая игнорирует файл конфигурации, он все равно переименовывается в соответствии со сборкой и автоматически включается в архив надстройки) для моих настроек. Основываясь на приведенной выше ссылке, я использовал следующий класс конфигурации

...

    public AppConfig()
    {
        try
        {
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = this.GetType().Assembly.Location + ".config";
            config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        }
        catch (Exception)
        {
            ...
        }
    }

    private string getValue(string key) 
    {
        return config.AppSettings.Settings[key].Value;
    }

...

Чтобы отредактировать конфигурацию после развертывания надстройки, мне пришлось закрыть ArcMap, открыть файл .esriAddIn с помощью winrar, перейти в \ install и открыть файл конфигурации, отредактировать его, закрыть редактор и затем разрешить winrar обновлять файл в архив. Затем перезагрузите ArcMap, и изменения вступят в силу. Досадно, что это одна из первых вещей, которые я попробовал, но я думаю, что у меня были проблемы, потому что редактор для конфигурационного файла все еще был открыт, когда winrar обновил архив.

tomfumb
источник
Были ли у вас какие-либо ошибки в последнее время с OpenMappedExeConfiguration? Я использовал подобный подход, который работал нормально, пока всего пару дней назад он перестал работать, возможно, после установки некоторых обновлений Windows. Посмотрите мой вопрос StackOverflow .
blah238
@ blah238 Я давно не тестировал эту надстройку и не имею возможности прямо сейчас. Однако, если вы сможете подвести итоги своих последних обновлений Windows / .NET, я смогу проверить, совпадают ли мои (Win7) и сообщить вам
tomfumb
Единственное, что мне показалось актуальным, было обновление безопасности .NET 4 . Не уверен, что это также может повлиять на .NET 3.5, на что я нацеливаюсь.
blah238
К вашему сведению, в итоге я переписал логику конфигурации моей надстройки, чтобы использовать традиционную сериализацию XML (de) вместо системы конфигурации .NET, основной чертой которой я решил, что файл .config автоматически извлекается вместе с сборка из файла .esriAddin - то, что вы, насколько я могу судить, не можете сделать с произвольным файлом XML, - но для своих целей я решил, что мне не нужно предоставлять конфигурацию по умолчанию, только сохранить пользовательские настройки). Я все еще хотел бы знать, затрагивает ли это также других разработчиков надстройки, все же.
blah238
Немного побольше по подходу .config, и Fusion показывает, что ESRI использует Assembly.LoadFrom () для загрузки сборок надстроек. Из того, что я прочитал, это противоречит рекомендациям по настройке отдельного домена приложений для надстроек и может объяснить, почему ConfigurationManager не беспокоится о поиске сборки в правильном месте. Чего я не понимаю, так это того, почему ему нужно снова искать сборку, когда она уже загружена в стандартный домен приложений. Я могу только предположить, что обновление безопасности .NET начало обеспечивать более частую проверку мест сборки.
blah238
6

Заимствуя из аналогичного ответа , вы можете использовать это в своем дополнении:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");
Кирк Куйкендалл
источник
Спасибо за подсказку, путь, созданный выше, недопустим, так как он дает ... / addInName.dll / config.xml, но это заставило меня пойти по правильному пути. Я сейчас использую немного прощеthis.GetType().Assembly.Location + ".config"
tomfumb
2

Стандартный файл конфигурации .NET для каждого приложения, а не для библиотеки. Это означает, что когда ваш плагин работает в процессе ArcMap, ваши параметры конфигурации должны быть указаны в ArcMap.exe.config, который должен быть размещен помимо ArcMap.exe.

Это, конечно, не всегда возможно в производственной среде, а также нарушает изоляцию надстроек, что является одной из причин, по которым надстройки были введены в первую очередь.

Вам нужно будет сохранить ваши настройки по-другому, либо в вашем собственном конфигурационном файле (как подсказано в ответе Кирка), либо в системном реестре.

Вы можете отслеживать изменения в вашем конфигурационном файле различными способами, например, используя класс FileSystemWatcher .

Петр Кребс
источник
1

Ответ Кирк Kuykendall не работал для меня, так как она все указывает на саму .dll. Я использовал следующее, чтобы указать на файл конфигурации

System.IO.StreamReader file = new System.IO.StreamReader(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location) + "\\config.cfg");
Эван Парсонс
источник
0

Хотя я не смотрел на новую модель для ESRI Addin, то, что я сделал и увидел, что другие сделали, это пользователь UserHive в реестре. После этого вы можете иметь экран в своем дополнении, чтобы обновить список необходимых вам значений.

Использование файла App.config обычно требует полной перезагрузки приложения / расширения для чтения новых значений; в то время как легче делать обновления на лету из реестра.

DEWright
источник
0

Вы можете попытаться изменить копию файла конфигурации, расположенного в кэше сборки надстройки . Я считаю, что эсриаддин расширяется только один раз ArcGIS. Поэтому последующие модификации не могут быть использованы (хотя следует заметить, что файл esriaddin новее, чем его кэш).

Vista / 7: C: \ Users \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssemblyCache

XP: C: \ Documents and Settings \\ Локальные настройки \ Данные приложения \ ESRI \ Desktop10.0 \ AssemblyCache

Джеймс Шек
источник
Интересное предложение, но, к сожалению, это не имеет значения. Файл конфигурации в каталоге AssemblyCache перезаписывается при запуске ArcMap - я изменил файл конфигурации здесь и в AddIn в ... \ Documents \ ArcGIS \ AddIns \ Desktop10. 0 так что я понятия не имею, откуда берется значение для перезаписи!
tomfumb
Цените входные данные, но похоже, что файл .esriAddIn в Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... фактически извлекается при каждой загрузке приложения, поэтому все изменения в кэше сборок надстройки теряются.
tomfumb