Accesso al file delle impostazioni di un altro progetto

C’è un modo per accedere al file delle impostazioni da un altro progetto? Ad esempio, ho una soluzione che contiene 2 progetti (li chiamiamo Proj1 e Proj2). Voglio accedere alle impostazioni dell’applicazione di Proj2 da Program.cs in Proj1. È ansible?

Opzione A: analizza i valori dal file di configurazione dell’altro assembly (dove sono memorizzate le impostazioni)

Opzione B: crea una class pubblica in Proj2 che espone i valori necessari dalle sue impostazioni come proprietà statiche, quindi fa riferimento Proj1 in Proj1 e consuma i valori da quella class.

Opzione C: se si desidera esporre TUTTE le impostazioni, è ansible modificare l’accesso della class delle impostazioni da internal a public .

Sono sicuro che ci sono anche altri modi.

La risposta se stai usando C #:
La risposta molto semplice è fare clic con il tasto destro su proj2, selezionare la scheda impostazioni. In alto, troverai il modificatore di accesso della class delle impostazioni: interna, cambialo in pubblico. Aggiungi un riferimento al proj2 nel proj1 per vedere la class Impostazioni proj2. È tutto.

Riporterò il contenuto del link di @ Kildareflare per riferimento futuro. Funziona ancora in VS2015, ma per quanto mi riguarda penso di preferire “Opzione B” sopra.

Ottenere l’accesso alle Impostazioni in un altro progetto

Una delle nuove funzionalità di Visual Studio 2005 è il nuovo editor di proprietà. Con questo editor di proprietà puoi facilmente aggiungere impostazioni alla tua applicazione. Ma c’è un problema nel modo in cui è implementato. Lascia che ti spieghi perché.

Di solito le impostazioni sono specifiche per un progetto. Quando aggiungi un’impostazione in un progetto, uno speciale strumento personalizzato associato al file delle impostazioni genera una nuova class che puoi utilizzare per accedervi. Ciò che è buono in questa class è che è fortemente digitato. Ma dietro la scena è solo ottenere una chiave da un file xml. Questa class generata è impostata come “internal sealed”. Questo impedisce l’accesso da qualsiasi altro assembly. Cosa succede se si desidera centralizzare dove si modificano queste impostazioni.

Dopo molti tentativi di esporlo ho trovato un modo facile e veloce per farlo. Diciamo che abbiamo 2 progetti nella nostra soluzione: un motore e una WinApp. Ognuno ha le impostazioni, ma vogliamo che siano modificabili da WinApp. Ecco come appare.

Impostazioni prima

Se vuoi avere accesso alle impostazioni del motore qui il trucco: aggiungi un file di collegamento.

Aggiungi link

Il file di collegamento verrà compilato come parte del progetto WinApp. La class di impostazione sarà ancora interna e sigillata ma al progetto WinApp anziché a Engine.

Questo è il risultato finale:

Impostazioni dopo

Si noti che ho aggiunto una cartella con lo stesso nome del mio progetto di motore. Ciò sarà utile se si desidera aggiungere impostazioni da molti progetti.

Con questo in posizione puoi accedere al tuo motore impostando la strada dal tuo motore di class come dalla tua class WinApp. Puoi omettere la parte “Motore” dalla tua class motore perché dovresti trovarti nello stesso spazio dei nomi. Ecco come dovrebbe essere:

 namespace WinApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void AccessConfig() { Engine.Properties.Settings.Default.EngineSetting = "test"; } } } 

Ho dovuto trovare un’altra soluzione oltre a quelle già date qui perché stavo usando XML Tranforms (tramite SlowCheetah) su App.config del mio progetto contenente le impostazioni. Se non lo fai, ti consiglio una delle altre soluzioni.

Ho aggiunto una fase di post-produzione nel progetto di consumo (Proj1 nell’esempio) per copiare il file di configurazione dalla cartella di output di Proj2. Ciò assicurerà che la configurazione abbia le trasformazioni applicate. (Nel mio caso, Proj1 è una DLL, quindi se il tuo è un exe, modifica i DestinationFiles da “.dll.config” a “.exe.config”.) Snippet da Proj1.csproj:

    

Quindi ho creato un collegamento di Settings.settings da Proj2 con ctrl + shift + trascinando il file su Proj1 (come nell’articolo del blog a cui fa riferimento Kildareflare ).

Potrei quindi fare riferimento alle impostazioni in Proj1 in modo simile a: Proj2.Properties.Settings.Default.MySetting .

Nota: se si esegue questa operazione per test di unità come I am (Proj1 è una DLL di test) e si sta utilizzando il runner di prova ReSharper, accertarsi di configurarlo per eseguire test in AppDomain separati .

Poiché Settings.Designer.cs è una class internal e non si desidera creare confusione con un file di codice generato, è consigliabile aggiungere il secondario come progetto “amico”.

Da: C # “interno” modificatore di accesso durante il test delle unità

Aggiungi il seguente codice al Proj2 del Proj2

 using System.Runtime.CompilerServices; [assembly:InternalsVisibleTo("Proj1")] 

Non ho provato questo metodo da solo, ma il piccolo trucco di Eric De Carufel potrebbe essere quello di cui hai bisogno:

http://blog.decarufel.net/2007/10/getting-access-to-settings-in-another.html

Il collegamento originale sembra essere morto mentre si è spostato su un nuovo blog e ha cancellato i vecchi contenuti.

Il contenuto originale è di seguito:

Ottenere l’accesso alle Impostazioni in un altro progetto

Giovedì, 25 ottobre 2007

Una delle nuove funzionalità di Visual Studio 2005 è il nuovo editor di proprietà. Con questo editor di proprietà puoi facilmente aggiungere impostazioni alla tua applicazione. Ma c’è un problema nel modo in cui è impelagato. Lascia che ti spieghi perché.

Di solito le impostazioni sono specifiche per un progetto. Quando aggiungi un’impostazione in un progetto, uno speciale strumento personalizzato associato al file delle impostazioni genera una nuova class che puoi utilizzare per accedervi. Ciò che è buono in questa class è che è fortemente digitato. Ma dietro la scena è solo ottenere una chiave da un file xml. Questa class generata è impostata come “internal sealed”. Ciò impedisce di accedere a qualsiasi altro assieme. Cosa succede se si desidera centralizzare dove si modificano queste impostazioni.

Dopo molti tentativi di esporlo ho trovato un modo facile e veloce per farlo. Diciamo che abbiamo 2 progetti nella nostra soluzione: un motore e una WinApp. Ognuno ha le impostazioni, ma vogliamo che siano modificabili da WinApp. Ecco come appare.

Se vuoi ottenere l’accesso alle impostazioni del motore, ecco il trucco: aggiungi un file di collegamento.

Il file di collegamento verrà compilato come parte del progetto WinApp. La class di impostazione sarà ancora interna e sigillata ma al progetto WinApp anziché a Engine.

Questo è il risultato finale:

Si noti che aggiungo un foler con lo stesso nome del mio progetto di motore. Ciò sarà utile se si desidera aggiungere impostazioni da molti progetti.

Con questo in posizione puoi accedere al tuo motore impostando la strada dal tuo motore di class come dalla tua class WinApp. Puoi omettere la parte “Motore” dalla tua class motore perché dovresti trovarti nello stesso spazio dei nomi. Ecco come dovrebbe essere:

 namespace WinApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void AccessConfig() { Engine.Properties.Settings.Default.EngineSetting = "test"; } } }