Додаток ArcMap з набором додатків не визнає зміни app.config?


14

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

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

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

Хтось знає надійний спосіб налаштування надбудови та дозволить оновити конфігурацію після розгортання? Будь-які пропозиції дуже вітаються, оскільки здається смішним, що для цього мені потрібен спеціальний конфігураційний файл.

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

Відповіді:


8

Я зрозумів, як налаштувати додаток.

Файл addin у ... Документах \ ArcGIS \ AddIns \ Desktop10.0 ... розширюється щоразу, коли ArcMap завантажується, тому єдине місце, де можна редагувати будь-які файли конфігурації, вбудовані у додаток, є тут. Я не експериментував із використанням ключів реєстру чи використанням спеціального каталогу конфігурації додатка, оскільки це просто здавалося зайвим.

Врешті-решт я використав файл app.config (тому що навіть якщо він використовується з бібліотекою класів, яка ігнорує конфігураційний файл, він все одно перейменовується відповідно до збірки та автоматично включається в архів addin) для моїх налаштувань. На основі наведеного вище посилання я використав наступний клас конфігурації

...

    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, перейти до \ встановити та відкрити конфігураційний файл, відредагувати його, закрити редактор, а потім дозволити winrar оновити файл у межах архів. Потім перезавантажується ArcMap, зміни змінюються. Прикро, це одне з перших речей, які я спробував, але, думаю, у мене виникли проблеми, оскільки редактор для конфігураційного файла все ще був відкритий, коли winrar оновив архів.


Чи стикалися ви останнім часом з помилками OpenMappedExeConfiguration? Я використовував подібний підхід, який працював нормально, поки лише пару днів тому він перестав працювати, можливо, після встановлення деяких оновлень Windows. Дивіться це моє питання StackOverflow .
blah238

@ blah238 Я не тестував цей додаток деякий час і не маю можливості зараз. Однак якщо ви можете підсумувати ваші останні оновлення Windows / .NET, я можу побачити, чи відповідає моє (Win7), і повідомляю вас
tomfumb

Єдине, що я бачив, що здавалося актуальним, було оновлення безпеки .NET 4 . Не впевнений, чи це може вплинути на .NET 3.5, на що я націлююсь.
blah238

FYI, я закінчив переписати логіку конфігурації моєї надбудови, щоб використовувати традиційну серіалізацію XML (де) замість системи конфігурації .NET, головним розіграшем якої я вважав, що файл .config автоматично вилучається разом із збірка з .esriAddin-файлу - те, що ви не можете зробити, наскільки я можу, зробити з довільним XML-файлом, - але для своїх цілей я вирішив, що мені не потрібно вводити конфігурацію за замовчуванням, зберігається лише налаштування для користувача). Я все ж хотів би знати, чи це впливає і на інших розробників додатків.
blah238

Побігаючи трохи більше підходу .config і Fusion виявляє, що ESRI використовує Assembly.LoadFrom () для завантаження надбудов. З того, що я прочитав, це суперечить кращій практиці, яка встановлює окремий AppDomain для надбудов, і може пояснити, чому ConfigurationManager не заважає шукати складання правильного місця. Що я не розумію, це чому навіть потрібно знову шукати збірку, коли вона вже була завантажена в AppDomain за замовчуванням. Я можу лише припустити, що оновлення безпеки .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, як правило, вимагає від вас повністю перезапустити додаток / розширення, щоб прочитати нові значення; при цьому простіше робити оновлення з реєстру на ходу.


0

Ви можете спробувати змінити копію конфігураційного файлу, розташованого в кеш-пам'яті надбудови . Я вважаю, що Есріаддін розширюється ArcGIS лише один раз. Тому наступні модифікації можуть не використовуватися (хоча слід помітити, що файл esriaddin є більш новим, ніж його кеш).

Vista / 7: C: \ Користувачі \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssemblyCache

XP: C: \ Документи та налаштування \\ Локальні налаштування \ Дані програми \ ESRI \ Desktop10.0 \ AssemblyCache


Цікава пропозиція, але, на жаль, це не змінило. Конфігураційний файл у каталозі AssemblyCache перезаписаний, коли ArcMap запускається - я змінив конфігураційний файл тут і в AddIn на ... \ Documents \ ArcGIS \ AddIns \ Desktop10. 0 тому я поняття не маю, звідки походить значення для перезапису!
tomfumb

Оцініть вхід, але він виглядає як файл .esriAddIn в Документах \ ArcGIS \ AddIns \ Desktop10.0 \ ..... насправді отримується щоразу, коли програма завантажується, тому всі зміни в кеш-складі надбудови втрачаються.
tomfumb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.