Complément ESRI ArcMap Config.esriaddinx

8

Je suis en train de convertir une ancienne extension ArcMap en un complément en C # et j'essaie de tirer le meilleur parti de la configuration basée sur XML.

Config.esriaddinx fonctionne très bien pour la configuration de base (barre d'outils, boutons, informations d'extension, etc.), mais existe-t-il un moyen d'ajouter d'autres paramètres de configuration, tels que les noms de champ, les noms de couche, les connexions à la base de données, etc.?

Aurais-je besoin de créer un fichier App.config? Si tel est le cas, le fichier App.config sera-t-il toujours conditionné / déployé de la même manière que le reste du complément? Quelle serait la meilleure méthode pour lire les paramètres? Je suis un débutant dans les compléments et toute suggestion ou échantillon serait grandement apprécié. Merci!

petegis
la source

Réponses:

4

Tout d'abord, je n'ai pas essayé d'utiliser Config.esriaddinx à cette fin, mais je ne le recommanderais pas. Il est destiné à la configuration du complément lui-même, pas nécessairement aux données utilisateur, et vous ne voulez probablement pas mélanger les deux.

Cela fait un moment que je n'ai pas traité cela moi-même, donc je peux être un peu flou sur les détails, mais il y a plusieurs problèmes avec l'utilisation des fichiers de configuration dans les compléments ArcGIS: Complément ArcMap avec app.settings ne reconnaissant pas l'application Les changements de .config?

En particulier, le répertoire dans lequel le complément est extrait est écrasé à chaque démarrage de l'application, vous ne pouvez donc pas vraiment persister les modifications des paramètres. Si vos paramètres ne changent jamais ou ne changent qu'avec chaque nouvelle version de votre complément, ce n'est probablement pas un problème.

Si, cependant, vous souhaitez rendre votre complément configurable par l'utilisateur final, vous devez stocker les informations configurables par l'utilisateur ailleurs afin qu'elles ne soient pas écrasées. Je suggère d'utiliser le dossier Application Data de l'utilisateur , dont vous pouvez déterminer le chemin par programme comme suit:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Je suggérerais également de le placer dans un sous-dossier nommé d'après votre complément. Mais essentiellement, vous chargeriez et enregistreriez dans un fichier à cet emplacement au lieu de lire les paramètres de la Settingsclasse de votre complément ou du fichier de configuration dans le répertoire du complément. Si vous souhaitez utiliser la configuration .NET pour cela, je suggère de lire les paramètres d'application et ConfigurationManager.

L'autre problème que j'ai rencontré concerne l'utilisation de sections de configuration personnalisées lors de l'utilisation de la configuration .NET. L'utilisation Assembly.LoadFromet la gestion de l'AssemblyResolve événement ont été la solution à ce problème particulier, bien que dans ce cas j'ai fini par ne pas utiliser la configuration .NET pour cela et pour d'autres raisons.

En fonction de la complexité de votre scénario de configuration, vous pouvez, comme je l'ai fait, éviter complètement d'utiliser le système de configuration .NET et utiliser à la place une autre méthode de lecture et d'écriture des informations de configuration. J'ai fini par utiliser des SerializableAttributeclasses marquées ou des classes implémentées IXmlSerializableà cet effet dans l'un des compléments les plus complexes que j'ai créés, qui comprenaient des paramètres configurables par l'utilisateur tels que des listes de couches, des paramètres de connexion, etc. Je recommanderais de lire la sérialisation d'objets dans. NET , Présentation de la sérialisation XML et comment implémenter correctement IXmlSerializable si vous êtes intéressé par cette approche.

Il semble que le vôtre soit dans le même sens, donc c'est à vous de décider, mais j'ai trouvé l'approche de sérialisation XML préférable à la configuration .NET pour tous, sauf le plus simple des scénarios de configuration (types de données simples, pas de hiérarchies / collections).

blah238
la source
Grande info ici, @ blah238! Je vais explorer ces options et voir ce qui fonctionnera le mieux.
petegis
Comment déployez-vous le fichier xml dans le dossier Environment.SpecialFolder.ApplicationData lorsque vous distribuez le fichier complémentaire à vos utilisateurs? S'agit-il de copier / coller manuellement le fichier?
Vidar
1

Créez un fichier config.xml et définissez son action de génération sur AddInContent sous les propriétés VS du fichier.

Pour ajouter à cela en fonction du commentaire, puisque vous le faites en C #, je supposais que vous utilisez Visual Studio pour créer votre complément. De là, si vous ajoutez un fichier de configuration XML à partir de la nouvelle option de fichier et le nommez config.xml, il créera un fichier vide par défaut. À partir de là, vous pouvez spécifier les paramètres xml de valeur clé sous la balise appSettings de la même manière qu'un fichier de configuration xml normal, puis vous y référer à partir du code comme vous le feriez normalement. Pour modifier son action de génération, lorsque vous avez le fichier sélectionné dans VS, regardez la fenêtre des propriétés et il devrait y avoir un paramètre d'action de génération. Sélectionnez-le et il affichera une liste déroulante des options disponibles, choisissez AddInContent dans la liste.

Dave Timmins
la source
1
Bienvenue à GISse. Ceci est une réponse très brève. Il serait utile d'inclure plus de détails, en incorporant peut-être certains des détails mentionnés par @petegis, comme comment ajouter des paramètres particuliers à ce fichier. De plus, comment feriez-vous pour créer ce fichier? Est-ce fait via ArcMap ou dans un éditeur de texte? Quelle est la bonne structure? Réfléchissez si vous n'en aviez jamais créé auparavant, que devez-vous savoir pour réussir. Ce genre d'information fera une superbe réponse. Bon départ!
Obtenez Spatial
Merci @davetimmins. Cela semble assez simple, j'ai donné un coup de feu et cela fonctionne tant que le fichier n'est pas réellement nommé "config.xml" (génère une erreur de génération "Impossible de créer un fichier alors que ce fichier existe déjà").
petegis