Componente aggiuntivo ArcMap con impostazioni app non riconoscendo le modifiche app.config?


14

Ho sviluppato un componente aggiuntivo ArcMap che richiede un file di configurazione. Dopo aver trascorso un po 'di tempo a provare a leggere i valori di configurazione da un singolo file App.Config (e ottenere sempre null), credo che il componente aggiuntivo non possa leggere i valori da qui poiché è una libreria di classi e cerca l'applicazione chiamante (ArcMap) Il file di configurazione quando chiedo il valore di una chiave (da qui il null).

Per ovviare a questo ho usato un file App.Settings, che l'applicazione può leggere bene. La creazione di questo introduce anche un file App.Config nell'ambiente e Visual Studio sembra mantenere i due file sincronizzati durante lo sviluppo.

Ora che il componente aggiuntivo viene distribuito, devo essere in grado di modificare i valori di configurazione (ad es. Posizione del file di registro). Ho provato ad aprire / estrarre il file .esriaddin e ad aggiornare il file App.Config, ma il componente aggiuntivo mantiene gli stessi valori di configurazione che aveva durante la compilazione. So che i nuovi valori di App.Config vengono mantenuti nel file .esriaddin perché posso visualizzarli di nuovo dopo aver chiuso l'archivio.

Qualcuno conosce un modo affidabile per configurare un componente aggiuntivo e consentire a questa configurazione di essere aggiornabile una volta distribuita? Qualsiasi suggerimento è molto gradito in quanto sembra ridicolo che per questo sia necessario un file di configurazione personalizzato.

I valori di App.Settings sono a livello di applicazione e attualmente sia App.Settings che App.Config hanno un'azione di compilazione: nessuna / non copia.

Risposte:


8

Ho capito come configurare il componente aggiuntivo.

Il file del componente aggiuntivo in ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... viene espanso ogni volta che ArcMap viene caricato, quindi l'unico posto in cui è possibile modificare QUALSIASI file di configurazione incorporato nel componente aggiuntivo è qui. Non ho sperimentato l'uso delle chiavi del Registro di sistema o l'uso di una directory di configurazione addin dedicata in quanto questo sembrava eccessivo.

Alla fine ho usato un file app.config (perché anche se usato con una libreria di classi, che ignora il file di configurazione, viene comunque rinominato in linea con l'assembly e automaticamente incluso nell'archivio dei componenti aggiuntivi) per le mie impostazioni. Sulla base di un link fornito sopra ho usato la seguente classe di configurazione

...

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

...

Per modificare la configurazione una volta distribuito il componente aggiuntivo, ho dovuto chiudere ArcMap, aprire il file .esriAddIn con winrar, andare a \ install e aprire il file di configurazione, modificarlo, chiudere l'editor e quindi consentire a winrar di aggiornare il file all'interno del archivio. Quindi ricaricando ArcMap la modifica ha inizio. È fastidiosamente una delle prime cose che ho provato ma penso di avere problemi perché l'editor per il file di configurazione era ancora aperto quando winrar ha aggiornato l'archivio.


Hai riscontrato degli errori negli ultimi tempi con OpenMappedExeConfiguration? Stavo usando un approccio simile che ha funzionato bene fino a quando, solo un paio di giorni fa, ha smesso di funzionare, forse dopo aver installato alcuni aggiornamenti di Windows. Vedi questa mia domanda StackOverflow .
blah238,

@ blah238 Non ho testato questo componente aggiuntivo per un po 'e non ho l'opportunità di farlo al momento. Tuttavia, se riesci a riassumere i tuoi recenti aggiornamenti di Windows / .NET, posso vedere se il mio (Win7) corrisponde e farti sapere
tomfumb

L'unico che ho visto che sembrava rilevante era un aggiornamento della sicurezza di .NET 4 . Non sono sicuro che ciò possa influire anche su .NET 3.5, che è ciò che sto prendendo di mira.
blah238,

Cordiali saluti, ho finito per riscrivere la logica di configurazione del mio componente aggiuntivo per utilizzare la serializzazione XML (de) tradizionale invece del sistema di configurazione .NET, il cui disegno principale ho immaginato fosse che il file .config viene estratto automaticamente insieme a l'assembly dal file .esriAddin - qualcosa che non posso, per quanto posso dire, fare con un file XML arbitrario - ma per i miei scopi ho deciso che non avevo davvero bisogno di fornire una configurazione predefinita, persistere impostazioni specifiche dell'utente). Vorrei comunque sapere se questo sta influenzando anche altri sviluppatori di componenti aggiuntivi.
blah238

Frugare ancora un po 'con l'approccio .config e Fusion rivela che ESRI sta usando Assembly.LoadFrom () per caricare gli assembly di componenti aggiuntivi. Da quello che ho letto questo va contro la migliore pratica che sta configurando un AppDomain separato per i componenti aggiuntivi e può spiegare perché ConfigurationManager non si preoccupa di cercare l'assemblaggio nella posizione corretta. Quello che non capisco è il motivo per cui deve anche cercare nuovamente l'assembly quando è già stato caricato nell'AppDomain predefinito. Posso solo supporre che un aggiornamento della sicurezza .NET abbia iniziato a controllare che le posizioni degli assembly vengano controllate più spesso.
blah238,

6

Prendendo in prestito da una risposta simile , potresti usarlo nel tuo componente aggiuntivo:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");

Grazie per il suggerimento, il percorso creato da quanto sopra non è valido in quanto fornisce ... / addInName.dll / config.xml, ma mi ha portato sulla strada giusta. Ora sto usando il leggermente più semplicethis.GetType().Assembly.Location + ".config"
tomfumb

2

Il file di configurazione .NET standard è per applicazione, non per libreria. Ciò significa che quando il componente aggiuntivo viene eseguito all'interno del processo ArcMap, è necessario specificare le impostazioni di configurazione in ArcMap.exe.config che deve essere posizionato oltre ad ArcMap.exe.

Questo ovviamente non è sempre possibile nell'ambiente di produzione e viola anche l'isolamento degli addin, che è uno dei motivi per cui gli addin sono stati introdotti in primo luogo.

Dovrai memorizzare le tue impostazioni in modo diverso, nel tuo file di configurazione (come suggerito nella risposta di Kirk) o nel registro di sistema.

È possibile monitorare le modifiche al file di configurazione in vari modi, ad esempio sfruttando la classe FileSystemWatcher .


1

La risposta di Kirk Kuykendall non ha funzionato per me, dal momento che continuava a indicare la stessa DLL. Ho usato quanto segue per indicare il file di configurazione

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

0

Mentre non ho esaminato il nuovo modello per il componente aggiuntivo ESRI, quello che ho fatto e visto fatto da altri è l'utente UserHive nel registro. È quindi possibile avere una schermata nel componente aggiuntivo per aggiornare la potenza dei valori necessari.

L'uso di un file App.config tende a richiedere il riavvio totale dell'app / estensione per leggere nuovi valori; mentre è più semplice eseguire aggiornamenti al volo dal registro.


0

È possibile provare a modificare la copia del file di configurazione situato nella cache del componente aggiuntivo . Credo che esriaddin venga ampliato solo una volta da ArcGIS. Quindi le successive modifiche non possono essere utilizzate (sebbene dovrebbe notare che il file esriaddin è più recente della sua cache).

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

XP: C: \ Documents and Settings \\ Impostazioni locali \ Dati applicazioni \ ESRI \ Desktop10.0 \ AssemblyCache


Suggerimento interessante ma sfortunatamente questo non ha fatto differenza. Il file di configurazione nella directory AssemblyCache viene sovrascritto all'avvio di ArcMap - Ho cambiato il file di configurazione qui e nell'AddIn in ... \ Documents \ ArcGIS \ AddIns \ Desktop10. 0 quindi non ho idea da dove provenga il valore per la sovrascrittura!
tomfumb,

Apprezzare l'input, ma sembra che il file .esriAddIn in Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... venga effettivamente estratto ogni volta che si carica l'applicazione, quindi tutte le modifiche nella cache dell'assembly del componente aggiuntivo vengono perse.
tomfumb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.