ArcMap-Add-In mit "app.settings" erkennt "app.config" -Änderungen nicht?

14

Ich habe ein ArcMap-Add-In entwickelt, für das eine Konfigurationsdatei erforderlich ist. Nachdem ich eine Weile versucht habe, Konfigurationswerte aus einer einzelnen App.Config-Datei zu lesen (und immer null zu bekommen), kann das Add-In meiner Meinung nach hier keine Werte lesen, da es sich um eine Klassenbibliothek handelt, und sucht nach der aufrufenden Anwendung (ArcMap). 's Konfigurationsdatei, wenn ich nach dem Wert eines Schlüssels frage (daher die Null).

Um dies zu umgehen, habe ich eine App.Settings-Datei verwendet, die die Anwendung gut lesen kann. Durch das Erstellen dieser Datei wird auch eine App.Config-Datei in die Umgebung eingefügt, und Visual Studio scheint die beiden Dateien während der Entwicklung synchron zu halten.

Jetzt, da das Add-In bereitgestellt wird, muss ich in der Lage sein, Konfigurationswerte (z. B. den Speicherort der Protokolldatei) zu ändern. Ich habe versucht, die .esriaddin-Datei zu öffnen / zu extrahieren und die App.Config-Datei dort zu aktualisieren, aber das Add-In behält die gleichen Konfigurationswerte bei, die es beim Kompilieren hatte. Ich weiß, dass die neuen App.Config-Werte in der .esriaddin-Datei beibehalten werden, da ich sie nach dem Schließen des Archivs erneut anzeigen kann.

Kennt jemand eine zuverlässige Möglichkeit, ein Add-In zu konfigurieren und zuzulassen, dass diese Konfiguration nach der Bereitstellung aktualisiert werden kann? Irgendwelche Vorschläge sind sehr willkommen, da es lächerlich erscheint, dass ich dafür eine benutzerdefinierte Konfigurationsdatei brauche.

App.Settings-Werte befinden sich auf Anwendungsebene, und derzeit haben sowohl App.Settings als auch App.Config folgende Build-Aktion: Keine / Nicht kopieren.

Tomfumb
quelle

Antworten:

8

Ich fand heraus, wie man das Add-In konfiguriert.

Die Add-In-Datei in ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... wird bei jedem Laden von ArcMap erweitert. Der einzige Ort, an dem im Add-In eingebettete Konfigurationsdateien bearbeitet werden können, befindet sich hier. Ich habe nicht mit der Verwendung von Registrierungsschlüsseln oder einem dedizierten Add-In-Konfigurationsverzeichnis experimentiert, da dies nur übertrieben schien.

Am Ende habe ich eine app.config-Datei für meine Einstellungen verwendet (denn auch wenn sie mit einer Klassenbibliothek verwendet wird, die die Konfigurationsdatei ignoriert, wird sie trotzdem entsprechend der Assembly umbenannt und automatisch in das Add-In-Archiv aufgenommen). Basierend auf einem oben angegebenen Link habe ich die folgende Konfigurationsklasse verwendet

...

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

...

Um die Konfiguration zu bearbeiten, nachdem das Add-In bereitgestellt wurde, musste ich ArcMap schließen, die .esriAddIn-Datei mit winrar öffnen, zu \ install wechseln und die Konfigurationsdatei öffnen, sie bearbeiten, den Editor schließen und winrar dann erlauben, die Datei in der zu aktualisieren Archiv. Nach dem erneuten Laden von ArcMap wird die Änderung wirksam. Leider ist dies eines der ersten Dinge, die ich ausprobiert habe, aber ich glaube, ich hatte Probleme, weil der Editor für die Konfigurationsdatei noch geöffnet war, als winrar das Archiv aktualisierte.

Tomfumb
quelle
Haben Sie in letzter Zeit Fehler mit OpenMappedExeConfiguration festgestellt? Ich habe einen ähnlichen Ansatz verwendet, der einwandfrei funktioniert hat, bis er vor ein paar Tagen aufgehört hat, möglicherweise nach der Installation einiger Windows-Updates. Siehe meine StackOverflow-Frage .
blah238
@ blah238 Ich habe dieses Add-In eine Weile nicht getestet und habe im Moment keine Gelegenheit dazu. Allerdings , wenn Sie Ihre bisherigen Windows - zusammenfassen können / .NET aktualisiert ich sehen kann , wenn ich (Win7) Spiel und lassen Sie wissen
tomfumb
Das einzige, was mir relevant erschien, war ein .NET 4-Sicherheitsupdate . Ich bin mir nicht sicher, ob dies auch .NET 3.5 betreffen könnte.
blah238
Zu Ihrer Information: Ich habe die Konfigurationslogik meines Add-Ins neu geschrieben, um anstelle des .NET-Konfigurationssystems die herkömmliche XML- (De-) Serialisierung zu verwenden. Als Hauptmerkmal stellte ich fest, dass die .config-Datei automatisch zusammen mit extrahiert wird Die Assembly aus der .esriAddin-Datei - etwas, das Sie, soweit ich das beurteilen kann, nicht mit einer beliebigen XML-Datei tun können -, aber für meine Zwecke entschied ich, dass ich keine Standardkonfiguration angeben musste, sondern nur bestehen blieb benutzerspezifische Einstellungen). Ich würde trotzdem gerne wissen, ob dies auch andere Add-In-Entwickler betrifft.
blah238
Mit dem .config-Ansatz kann man ein bisschen mehr herumstöbern, und Fusion zeigt, dass ESRI Assembly.LoadFrom () verwendet, um Add-In-Assemblys zu laden. Nach dem, was ich gelesen habe, widerspricht dies der bewährten Methode, eine separate AppDomain für Add-Ins einzurichten, und erklärt möglicherweise, warum ConfigurationManager nicht nach dem richtigen Speicherort für die Assembly sucht. Was ich nicht verstehe, ist, warum es sogar noch einmal nach der Assembly suchen muss, wenn sie bereits in der Standard-AppDomain geladen wurde. Ich kann nur davon ausgehen, dass ein .NET-Sicherheitsupdate begonnen hat, die Überprüfung der Assemblyspeicherorte häufiger zu erzwingen.
blah238
6

In Anlehnung an eine ähnliche Antwort können Sie dies in Ihrem Add-In verwenden:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");
Kirk Kuykendall
quelle
Vielen Dank für den Tipp, der von oben erstellte Pfad ist nicht gültig, da er ... / addInName.dll / config.xml enthält, aber er hat mich auf den richtigen Weg gebracht. Ich benutze jetzt die etwas einfacherethis.GetType().Assembly.Location + ".config"
Tomfumb
2

Die standardmäßige .NET-Konfigurationsdatei ist pro Anwendung und nicht pro Bibliothek. Dies bedeutet, dass Ihre Konfigurationseinstellungen in ArcMap.exe.config angegeben werden müssen, wenn Ihr Add-In im ArcMap-Prozess ausgeführt wird. Diese Konfigurationseinstellungen müssen neben ArcMap.exe platziert werden.

Dies ist in der Produktionsumgebung natürlich nicht immer möglich und verletzt auch die Isolation von Addins, was einer der Gründe ist, warum Addins überhaupt eingeführt wurden.

Sie müssen Ihre Einstellungen anders speichern, entweder in Ihrer eigenen Konfigurationsdatei (wie in Kirks Antwort angegeben) oder in der Systemregistrierung.

Sie können Änderungen an Ihrer Konfigurationsdatei auf verschiedene Arten überwachen, beispielsweise mithilfe der FileSystemWatcher- Klasse.

Petr Krebs
quelle
1

Die Antwort von Kirk Kuykendall hat bei mir nicht funktioniert, da sie immer wieder auf die DLL selbst verweist. Ich habe Folgendes verwendet, um auf die Konfigurationsdatei zu verweisen

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

Während ich mir das neue Modell für das ESRI-Addin nicht angesehen habe, ist das, was ich von anderen getan und gesehen habe, der Benutzer des UserHive in der Registrierung. Sie können dann einen Bildschirm in Ihrem Add-In haben, um die Liste der benötigten Werte zu aktualisieren.

Bei Verwendung einer App.config-Datei müssen Sie die App / Erweiterung in der Regel neu starten, um neue Werte zu lesen. Es ist einfacher, Aktualisierungen direkt aus der Registrierung vorzunehmen.

DEWright
quelle
0

Sie können versuchen, die Kopie der Konfigurationsdatei im Add-In-Assembly-Cache zu ändern . Ich glaube, der Esriaddin wird von ArcGIS nur einmal erweitert. Nachträgliche Änderungen können daher möglicherweise nicht verwendet werden (obwohl darauf hingewiesen werden sollte , dass die esriaddin-Datei neuer als ihr Cache ist).

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

XP: C: \ Dokumente und Einstellungen \\ Lokale Einstellungen \ Anwendungsdaten \ ESRI \ Desktop10.0 \ AssemblyCache

James Schek
quelle
Interessanter Vorschlag, aber dies hat leider keinen Unterschied gemacht. Die Konfigurationsdatei im AssemblyCache-Verzeichnis wird beim Start von ArcMap überschrieben. Ich habe die Konfigurationsdatei hier und im AddIn unter ... \ Documents \ ArcGIS \ AddIns \ Desktop10 geändert. 0 also ich habe keine ahnung woher der wert für das überschreiben kommt!
Tomfumb
Schätzen Sie die Eingabe, aber es sieht so aus, als würde die .esriAddIn-Datei in Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... bei jedem Laden der Anwendung extrahiert, sodass alle Änderungen im Add-In-Assembly-Cache verloren gehen.
Tomfumb