Drei mögliche Lösungen
Ich weiß, dass ich zu spät zur Party komme, aber ich habe mich umgesehen, ob es neue Lösungen für das Problem der variablen Konfigurationseinstellungen gibt. Es gibt ein paar Antworten, die die Lösungen, die ich in der Vergangenheit verwendet haben, berühren, aber die meisten scheinen ein bisschen verworren. Ich dachte, ich schaue mir meine alten Lösungen an und fasse die Implementierungen zusammen, damit es anderen helfen kann, die mit demselben Problem kämpfen.
Für dieses Beispiel habe ich die folgende Einstellung in einer Konsolenanwendung verwendet:
<appSettings>
<add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
<add key="StaticClassExample" value="bin"/>
<add key="InterpollationExample" value="{0}bin"/>
</appSettings>
1. Umgebungsvariablen verwenden
Ich glaube, Autocro autocro's Antwort berührte es. Ich tue nur eine Implementierung, die beim Erstellen oder Debuggen ausreichen sollte, ohne dass Visual Studio geschlossen werden muss. Ich habe diese Lösung zurück in den Tag verwendet ...
'
private void Test_Environment_Variables()
{
string BaseDir = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
string ExpandedPath = Environment.ExpandEnvironmentVariables(BaseDir).Replace("\"", ""); //The function addes a " at the end of the variable
Console.WriteLine($"From within the C# Console Application {ExpandedPath}");
}
'
2. Verwenden Sie die String-Interpolation:
-
Verwenden Sie die Funktion string.Format()
`
private void Test_Interpollation()
{
string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
Console.WriteLine($"Using old interpollation {ExpandedPath}");
}
`
3. Verwendung einer statischen Klasse. Dies ist die Lösung, die ich meistens verwende.
`
private void Test_Static_Class()
{
Console.WriteLine($"Using a static config class {Configuration.BinPath}");
}
`
`
static class Configuration
{
public static string BinPath
{
get
{
string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
return SolutionPath + ConfigPath;
}
}
}
`
Projekt-Code:
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<appSettings>
<add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
<add key="StaticClassExample" value="bin"/>
<add key="InterpollationExample" value="{0}bin"/>
</appSettings>
</configuration>
Programm.cs
using System;
using System.Configuration;
using System.IO;
namespace ConfigInterpollation
{
class Program
{
static void Main(string[] args)
{
new Console_Tests().Run_Tests();
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
}
internal class Console_Tests
{
public void Run_Tests()
{
Test_Environment_Variables();
Test_Interpollation();
Test_Static_Class();
}
private void Test_Environment_Variables()
{
string ConfigPath = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
string ExpandedPath = Environment.ExpandEnvironmentVariables(ConfigPath).Replace("\"", "");
Console.WriteLine($"Using environment variables {ExpandedPath}");
}
private void Test_Interpollation()
{
string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
Console.WriteLine($"Using interpollation {ExpandedPath}");
}
private void Test_Static_Class()
{
Console.WriteLine($"Using a static config class {Configuration.BinPath}");
}
}
static class Configuration
{
public static string BinPath
{
get
{
string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
return SolutionPath + ConfigPath;
}
}
}
}
Veranstaltung vor dem Bau:
Projekteinstellungen -> Build-Ereignisse
1 Stimmen
Ich glaube, er meint damit die Definition von Variablen, die in appSettings-Schlüsseln direkt in den Konfigurationsdateien verwendet werden sollen.
1 Stimmen
Ich habe auch die Verwendung der XML <!ENTITY>-Deklaration ausprobiert, aber sie wird aufgrund der Art und Weise, wie MS web.config-Dateien behandelt, nicht unterstützt.
0 Stimmen
Vielen Dank für Ihre Bemühungen. Ich ziehe es vor, keinen Code zu ändern. Der Code enthält bereits eine Anweisung, die lautet: string dir2=ConfigurationManager.AppSettings["Dir2"]. Ich möchte nur die app.config bereinigen, in der jetzt value=" steht. D:\blahdir\Dir2 " anstelle von value="[MyBaseDir] \Dir2 "