2012-06-06 29 views
7

Utilizzando la Roslyn June 2012 CTP:L'accesso ai file .config a Roslyn REPL

C'è un modo per fornire il Roslyn C# Interactive/REPL con un file .config per il codice in fase di studio? Un semplice esempio di scenario è il codice che dipende da una stringa di connessione che normalmente otterrebbe da app.config/web.config.

risposta

3

Questo è effettivamente possibile ora (e potrebbe essere stato nel momento in cui è stata posta questa domanda). È sufficiente creare un file LoadConfig.csx con il seguente:

#r "System.Configuration" 

using System; 
using System.IO; 
using System.Linq; 


var paths = new[] { Path.Combine(Environment.CurrentDirectory, "Web.config"), Path.Combine(Environment.CurrentDirectory, "App.config") }; 
var configPath = paths.FirstOrDefault(p => File.Exists(p)); 

if (configPath != null) 
{ 
    // Set new configuration path 
    AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", configPath); 

    // Reset current configuration load state 
    var t = typeof(System.Configuration.ConfigurationManager); 
    var f = t.GetField("s_initState", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
    f.SetValue(null, 0); 
} 

Salvare il file da qualche parte si ricorda e tornare al progetto che si desidera caricare in Visual Studio. Fare clic con il tasto destro del mouse sul progetto e selezionare "Ripristina C# Interattivo dal progetto". Una volta che la finestra interattiva C# è terminato il caricamento delle chiamate:

#load "C:\path\to\LoadConfig.csx" 

NOTA: È necessario chiamare questo subito dopo il caricamento del progetto. Se si verificano delle ricerche di configurazione prima di caricare questo script, questo script non funzionerà.

Ora la finestra interattiva C# dovrebbe avere accesso alle impostazioni del progetto.

+1

Solo curioso di sapere se questo funziona per qualcun altro? Non sembra funzionare per me. Questa è una tragedia, poiché esegue il rendering di tutti gli assembly che ottengono, ad esempio, informazioni sulla stringa di connessione da un file di configurazione come non testabili dalla finestra interattiva C#. Questo potrebbe essere uno strumento così utile, e al momento è reso quasi inutile per me. – esmoore68

+0

Non funziona anche per me. Sto usando Visual Studio 2017 – Jalal

4

Non c'è un modo per farlo in questo momento, anche se è qualcosa che stiamo pensando per il futuro.

Nel frattempo, è possibile considerare il codice come una stringa di connessione come parametro e passarlo nel metodo nella finestra interattiva?

+1

Grazie Kevin, è quello che ho finito per fare. Spero che la funzionalità di .config la trasformi in una versione futura del REPL in quanto trovo un bel po 'di codice che ha dipendenze su un file di configurazione. BTW - Sono un grande fan di quello che stai facendo con Roslyn, si scatena! – Stuart

+1

Una cosa che vorrei aggiungere: Avere qualcosa come un linguaggio di script C# può sostituire cose come i file .config e può essere applicato all'iniezione delle dipendenze in generale. Immagina che il file di script sia distribuito con il binario e all'avvio può eseguire lo script e caricare qualsiasi cosa ritorni in un ConfigurationManager o qualsiasi altra cosa. L'iniezione di dipendenza funzionerebbe allo stesso modo, basta invocare lo script per risolvere ciò che il costruttore/le proprietà devono essere chiamati per creare un'istanza di un particolare oggetto. Quindi, in sostanza, + 1M voti per avere .config in Roslyn (è un piccolo passo nella giusta direzione). – gzak

1

La risposta già accettata non ha funzionato per me; in base ai commenti alla risposta accettata, non ha funzionato anche per altri due. Sotto la soluzione ha funzionato per me.

  1. Aggiornare il file di configurazione di C# interattivo (REPL) che è situato in

    AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

  2. Re-inizializzare REPL.