2012-06-06 5 views
7

Mit dem Roslyn June 2012 CTP:Zugang zu .config Dateien in Roslyn REPL

Gibt es eine Möglichkeit, die Roslyn C# Interactive/REPL mit einer CONFIG-Datei für den Code erforscht zu bieten? Ein einfaches Beispielszenario ist Code, der von einer Verbindungszeichenfolge abhängt, die er normalerweise aus der Datei app.config/web.config erhält.

Antwort

3

Dies ist jetzt tatsächlich möglich (und möglicherweise zu der Zeit, als diese Frage gestellt wurde). Erstellen Sie einfach eine LoadConfig.csx Datei mit folgendem:

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

Speichern Sie die Datei irgendwo werden Sie merken und zurück zum Projekt, das Sie in Visual Studio geladen werden soll. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie "C# Interactive vom Projekt zurücksetzen". Sobald das interaktive C# -Fenster beendet ist, rufen Sie an:

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

HINWEIS: Sie müssen dies sofort nach dem Laden des Projekts aufrufen. Wenn vor dem Laden dieses Skripts Konfigurationssuchen durchgeführt werden, funktioniert dieses Skript nicht.

Jetzt sollte das C# Interactive-Fenster Zugriff auf Ihre Projekteinstellungen haben.

+1

Nur neugierig, ob das für jemand anderen funktioniert? Scheint nicht für mich zu arbeiten. Dies ist eine Tragödie, da es alle Assemblys rendert, die Verbindungsketteninformationen aus einer Konfigurationsdatei als nicht testbar aus dem interaktiven C# -Fenster erhalten. Dies könnte ein so nützliches Werkzeug sein, und jetzt ist es für mich fast nutzlos. – esmoore68

+0

Funktioniert nicht auch für mich. Ich verwende Visual Studio 2017 – Jalal

4

Es gibt keinen Weg, dies jetzt zu tun, obwohl es etwas ist, an das wir für die Zukunft denken.

Können Sie in der Zwischenzeit Ihren Code so einteilen, dass er die Verbindungszeichenfolge als Parameter verwendet und sie einfach an die Methode im interaktiven Fenster weitergibt?

+1

Danke Kevin, das ist, was ich getan habe. Ich hoffe, die .config-Funktionalität macht es zu einer zukünftigen Version der REPL, da ich auf eine Menge Code stoße, der von einer Konfigurationsdatei abhängig ist. BTW - Ich bin ein großer Fan von dem, was du mit Roslyn machst, es rockt! – Stuart

+1

Eine Sache, die ich hinzufügen möchte: Etwas wie eine C# -Skriptsprache kann Dinge wie .config-Dateien ersetzen und kann im Allgemeinen auf Abhängigkeitsinjektion angewendet werden. Stellen Sie sich die Skriptdatei vor, die mit der Binärdatei bereitgestellt wird, und beim Start kann sie das Skript ausführen und alles laden, was sie in einen ConfigurationManager oder sonst etwas zurückgibt. Die Abhängigkeitsinjektion würde ähnlich funktionieren. Rufen Sie einfach das Skript auf, um aufzulösen, welcher Konstruktor/welche Eigenschaften aufgerufen werden müssen, um ein bestimmtes Objekt zu instanziieren. Also, im Prinzip stimmen + 1M dafür, in Roslyn .config zu haben (es ist ein kleiner Schritt in die richtige Richtung). – gzak

1

Bereits akzeptierte Antwort funktionierte nicht für mich; basierend auf den Kommentaren zur angenommenen Antwort, funktionierte es auch nicht für zwei andere. Unten Lösung funktionierte für mich.

  1. Aktualisieren Sie die Konfigurationsdatei von C# interactive (ERS), die bei

    AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

  2. neu initialisieren REPL befindet.