Il modo migliore per ottenere un percorso per machine.config di una versione diversa di .NET
-
12-10-2019 - |
Domanda
Che cosa è il modo migliore per ottenere un percorso per il file .net 2.0 machine.config, se l'applicazione è in esecuzione su .NET 4.0?
Un modo sarebbe quello di fare manipolazione di stringhe e file di sistema di accesso per sostituire v4.0 * con * v2.0 in
new ConfigurationFileMap().MachineConfigFilename;
e poi passano a ConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(<HERE>))
. Mi farà ricorso a questa soluzione se niente di meglio è disponibile.
Soluzione
Da quando ho avuto bisogno il percorso di machine.config per le versioni di ASP.NET, non mi importa di tutti i percorsi framework .NET (per esempio 3 e 3,5 quadri dal momento che sono solo le estensioni di 2.0). Ho finito per l'interrogazione di chiave di registro e il valore HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET
Path
della chiave quadro. Infine aggiungendo config\machine.config
al percorso quadro dato risultati desiderati.
Il metodo per mappare runtime ASP.NET al percorso machine.config avrebbe preso stringhe di qualsiasi "v2.0" format "2.0.50727.0" o semplicemente "v2" e "2", regex è a uno cifre un decimale come "2.0" o di una prima cifra se le cifre decimali non sono stati specificati come "2" ed ottenere il giusto valore dal registro di sistema. Qualcosa di simile a questo:
string runtimeVersion = "2.0";
string frameworkPath;
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\ASP.NET");
foreach (string childKeyName in regKey.GetSubKeyNames())
{
if (Regex.IsMatch(childKeyName, runtimeVersion))
{
RegistryKey subKey = regKey.OpenSubKey(childKeyName))
{
frameworkPath = (string)subKey.GetValue("Path");
}
}
}
string machineConfigPath = Path.Combine(frameworkPath, @"config\machine.config");
string webRootConfigPath = Path.Combine(frameworkPath, @"config\web.config");
Infine, mi passa questo file di configurazione per WebConfigurationMap (sto usando Microsoft.Web.Administration, ma è possibile utilizzarlo con System.Configuration così, il codice è quasi lo stesso):
using (ServerManager manager = new ServerManager())
{
Configuration rootWebConfig = manager.GetWebConfiguration(new WebConfigurationMap(machineConfigPath, webRootConfigPath), null);
}
WebConfigurationMap mappe configurazione personalizzata machine.config e web.config root (quindi nullo come secondo argomento GetWebConfiguration ())