Le complément ArcMap avec app.settings ne reconnaît pas les modifications app.config?

14

J'ai développé un complément ArcMap qui nécessite un fichier de configuration. Après avoir passé un certain temps à essayer de lire les valeurs de configuration à partir d'un seul fichier App.Config (et toujours à obtenir la valeur nulle), je crois que le complément ne peut pas lire les valeurs d'ici car il s'agit d'une bibliothèque de classes et recherche l'application appelante (ArcMap) du fichier de configuration lorsque je demande la valeur d'une clé (d'où le null).

Pour contourner ce problème, j'ai utilisé un fichier App.Settings, que l'application peut lire correctement. La création de ce fichier introduit également un fichier App.Config dans l'environnement et Visual Studio semble garder les deux fichiers synchronisés pendant le développement.

Maintenant que le complément est en cours de déploiement, je dois pouvoir modifier les valeurs de configuration (par exemple, l'emplacement du fichier journal). J'ai essayé d'ouvrir / d'extraire le fichier .esriaddin et de mettre à jour le fichier App.Config là-dedans, mais le complément conserve les mêmes valeurs de configuration qu'il avait lors de la compilation. Je sais que les nouvelles valeurs App.Config sont conservées dans le fichier .esriaddin car je peux les afficher à nouveau après la fermeture de l'archive.

Quelqu'un connaît-il un moyen fiable de configurer un complément et d'autoriser cette mise à jour une fois déployé? Toutes les suggestions sont les bienvenues car il semble ridicule que j'aie besoin d'un fichier de configuration personnalisé pour cela.

Les valeurs App.Settings sont au niveau de l'application, et actuellement App.Settings et App.Config ont une action de génération: aucune / ne copie pas.

tomfumb
la source

Réponses:

8

J'ai compris comment configurer l'addin.

Le fichier complémentaire dans ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... est développé à chaque chargement d'ArcMap, de sorte que le seul endroit où TOUT fichier de configuration incorporé dans le complément peut être modifié se trouve ici. Je n'ai pas essayé d'utiliser des clés de registre ou d'utiliser un répertoire de configuration de complément dédié car cela semblait tout simplement excessif.

À la fin, j'ai utilisé un fichier app.config (car même s'il est utilisé avec une bibliothèque de classes, qui ignore le fichier de configuration, il est toujours renommé conformément à l'assembly et automatiquement inclus dans l'archive du complément) pour mes paramètres. Sur la base d'un lien fourni ci-dessus, j'ai utilisé la classe de configuration suivante

...

    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;
    }

...

Pour modifier la configuration une fois l'addin déployé, j'ai dû fermer ArcMap, ouvrir le fichier .esriAddIn avec winrar, aller dans \ install et ouvrir le fichier de configuration, le modifier, fermer l'éditeur, puis autoriser winrar à mettre à jour le fichier dans le archiver. Ensuite, en rechargeant ArcMap, la modification entre en vigueur. C'est ennuyeux, c'est l'une des premières choses que j'ai essayées, mais je pense que j'ai eu des problèmes car l'éditeur du fichier de configuration était toujours ouvert lorsque winrar a mis à jour l'archive.

tomfumb
la source
Avez-vous rencontré des erreurs récemment avec OpenMappedExeConfiguration? J'utilisais une approche similaire qui fonctionnait bien jusqu'à il y a quelques jours à peine, elle a cessé de fonctionner, peut-être après l'installation de certaines mises à jour Windows. Voir ma question StackOverflow .
blah238
@ blah238 Je n'ai pas testé ce complément depuis un moment et je n'ai pas la possibilité de le faire pour le moment. Cependant, si vous pouvez résumer vos récentes mises à jour Windows / .NET, je peux voir si le mien (Win7) correspond et vous le faire savoir
tomfumb
La seule que j'ai vue qui semblait pertinente était une mise à jour de sécurité .NET 4 . Je ne sais pas si cela pourrait également affecter .NET 3.5, ce que je cible.
blah238
Pour info, j'ai fini par réécrire la logique de configuration de mon complément pour utiliser la sérialisation XML (dé) traditionnelle au lieu du système de configuration .NET, dont le principal attrait était que le fichier .config était automatiquement extrait avec l'assemblage à partir du fichier .esriAddin - quelque chose que vous ne pouvez pas, pour autant que je sache, faire avec un fichier XML arbitraire - mais pour mes besoins, j'ai décidé que je n'avais pas vraiment besoin de fournir une configuration par défaut, ne persistez que paramètres spécifiques à l'utilisateur). Je voudrais quand même savoir si cela affecte également d'autres développeurs de compléments.
blah238
En fouillant un peu plus avec l'approche .config et Fusion, ESRI utilise Assembly.LoadFrom () pour charger les assemblys de compléments. D'après ce que j'ai lu, cela va à l'encontre de la meilleure pratique qui consiste à configurer un AppDomain distinct pour les compléments, et peut expliquer pourquoi ConfigurationManager ne prend pas la peine de rechercher l'assembly à l'emplacement correct. Ce que je ne comprends pas, c'est pourquoi il doit même rechercher à nouveau l'assembly alors qu'il a déjà été chargé dans l'AppDomain par défaut. Je ne peux que supposer qu'une mise à jour de sécurité .NET a commencé à imposer que les emplacements des assemblys soient vérifiés plus souvent.
blah238
6

Empruntant à une réponse similaire , vous pouvez utiliser ceci dans votre complément:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");
Kirk Kuykendall
la source
Merci pour l'astuce, le chemin créé par ce qui précède n'est pas valide car il donne ... / addInName.dll / config.xml, mais il m'a mis sur la bonne voie. J'utilise maintenant un peu plus simplethis.GetType().Assembly.Location + ".config"
tomfumb
2

Le fichier de configuration .NET standard est par application, pas par bibliothèque. Cela signifie que lorsque votre complément s'exécute dans le processus ArcMap, vos paramètres de configuration doivent être spécifiés dans ArcMap.exe.config qui doit être placé à côté d'ArcMap.exe.

Bien sûr, cela n'est pas toujours possible dans l'environnement de production et viole également l'isolement des addins, qui est l'une des raisons pour lesquelles les addins ont été introduits en premier lieu.

Vous devrez stocker vos paramètres différemment, soit dans votre propre fichier de configuration (comme indiqué dans la réponse de Kirk) ou dans le registre système.

Vous pouvez surveiller les modifications apportées à votre fichier de configuration de différentes manières, par exemple en tirant parti de la classe FileSystemWatcher .

Petr Krebs
la source
1

La réponse de Kirk Kuykendall n'a pas fonctionné pour moi, car elle pointait toujours le fichier .dll lui-même. J'ai utilisé ce qui suit pour pointer vers le fichier de configuration

System.IO.StreamReader file = new System.IO.StreamReader(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location) + "\\config.cfg");
Evan Parsons
la source
0

Bien que je n'aie pas regardé le nouveau modèle pour le complément ESRI, ce que j'ai fait et vu fait par d'autres est l'utilisateur de la UserHive dans le registre. Vous pouvez alors avoir un écran dans votre add-in pour mettre à jour les valeurs dont vous avez besoin.

L'utilisation d'un fichier App.config nécessite généralement de redémarrer l'application / l'extension pour lire de nouvelles valeurs; tandis qu'il est plus facile de faire des mises à jour à la volée à partir du registre.

DEWright
la source
0

Vous pouvez essayer de modifier la copie du fichier de configuration situé dans le cache de l'assembly du complément . Je crois que l'esriaddin n'est développé qu'une seule fois par ArcGIS. Par conséquent, les modifications ultérieures ne peuvent pas être utilisées (même s'il convient de noter que le fichier esriaddin est plus récent que son cache).

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

XP: C: \ Documents and Settings \\ Local Settings \ Application Data \ ESRI \ Desktop10.0 \ AssemblyCache

James Schek
la source
Suggestion intéressante, mais malheureusement, cela n'a pas fait de différence.Le fichier de configuration dans le répertoire AssemblyCache est écrasé au démarrage d'ArcMap - j'ai changé le fichier de configuration ici et dans le complément à ... \ Documents \ ArcGIS \ AddIns \ Desktop10. 0 donc je n'ai aucune idée d'où vient la valeur de l'écrasement!
tomfumb le
Appréciez l'entrée, mais il ressemble au fichier .esriAddIn dans Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... est en fait extrait à chaque chargement de l'application, de sorte que toutes les modifications dans le cache de l'assembly du complément sont perdues.
tomfumb le