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.

È stato utile?

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 ())

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top