Non è banale creare un file di configurazione .NET per un .DLL, e per buoni motivi. Il meccanismo di configurazione .NET ha molte funzionalità integrate per facilitare l'upgrade / aggiornamento dell'app e per proteggere le app installate dal calpestare i file di configurazione degli altri.
C'è una grande differenza tra il modo in cui viene utilizzata una DLL e il modo in cui viene utilizzata un'applicazione. È improbabile che più copie di un'applicazione siano installate sullo stesso computer per lo stesso utente. Ma potresti avere ben 100 app o librerie diverse che fanno uso di alcune DLL .NET.
Mentre raramente è necessario tenere traccia delle impostazioni separatamente per diverse copie di un'app all'interno di un profilo utente, è molto improbabile che si desideri che tutti i diversi usi di una DLL condividano la configurazione tra loro. Per questo motivo, quando si recupera un oggetto Configuration utilizzando il metodo "normale", l'oggetto che si ottiene è legato alla configurazione del dominio app in cui si esegue, anziché al particolare assembly.
Il dominio app è associato all'assembly root che ha caricato l'assembly in cui si trova effettivamente il codice. Nella maggior parte dei casi si tratterà dell'assemblaggio del file .EXE principale, che è ciò che ha caricato il .DLL. È possibile eseguire il rollup di altri domini di app all'interno di un'applicazione, ma è necessario fornire esplicitamente informazioni sull'assemblaggio root di quel dominio di app.
Per questo motivo, la procedura per la creazione di un file di configurazione specifico della libreria non è così conveniente. È lo stesso processo che useresti per creare un file di configurazione portatile arbitrario non legato ad alcun particolare assembly, ma per il quale vuoi usare lo schema XML, la sezione di configurazione e i meccanismi degli elementi di configurazione di .NET, ecc. Ciò comporta la creazione di un ExeConfigurationFileMap
oggetto , caricando i dati per identificare dove verrà archiviato il file di configurazione e quindi chiamando ConfigurationManager
.OpenMappedExeConfiguration
per aprirlo in una nuova Configuration
istanza. Questo vi interromperla dalla protezione versione offerta dal meccanismo automatico di generazione del percorso.
Statisticamente parlando, probabilmente stai usando questa libreria in un ambiente interno, ed è improbabile che tu abbia più app che la usano all'interno di una macchina / utente. In caso contrario, c'è qualcosa che dovresti tenere a mente. Se si utilizza un singolo file di configurazione globale per la DLL, indipendentemente dall'app a cui fa riferimento, è necessario preoccuparsi dei conflitti di accesso. Se due app che fanno riferimento alla tua libreria sono in esecuzione contemporaneamente, ognuna con il proprio Configuration
oggetto aperto, quindi quando si salvano le modifiche, si verificherà un'eccezione la prossima volta che si tenta di recuperare o salvare i dati nell'altra app.
Il modo più sicuro e semplice per aggirare il problema è richiedere che l'assembly che sta caricando la DLL fornisca anche alcune informazioni su se stesso o rilevarlo esaminando il dominio app dell'assembly di riferimento. Usalo per creare una sorta di struttura di cartelle per mantenere file di configurazione utente separati per ogni app che fa riferimento alla tua DLL.
Se sei sicuro di voler avere impostazioni globali per la tua DLL, indipendentemente da dove viene referenziata, dovrai determinare la tua posizione per essa piuttosto che .NET trovarne una appropriata automaticamente. Dovrai anche essere aggressivo nella gestione dell'accesso al file. Dovrai memorizzare nella cache il più possibile, mantenendo l' Configuration
istanza SOLO per tutto il tempo necessario per caricare o salvare, aprendo immediatamente prima e eliminando immediatamente dopo. Infine, avrai bisogno di un meccanismo di blocco per proteggere il file mentre viene modificato da una delle app che utilizzano la libreria.