2010-12-23 7 views
1

Was ist der beste Weg, um einen Pfad zu .net 2.0 machine.config-Datei zu erhalten, wenn die Anwendung unter .net 4.0 ausgeführt wird?Der beste Weg, um einen Pfad zu machine.config einer anderen .NET-Version zu erhalten

Eine Möglichkeit wäre, den Zugang String-Manipulation und das Dateisystem zu tun v4.0 zu ersetzen * mit v2.0 * in new ConfigurationFileMap().MachineConfigFilename; und es dann zu ConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(<HERE>)) passieren. Ich werde auf diese Lösung zurückgreifen, wenn nichts Besseres verfügbar ist.

Antwort

7

Da ich den Pfad zu machine.config für ASP.NET-Versionen brauchte, kümmerte ich mich nicht um alle .NET Framework-Pfade (z. B. 3 und 3.5 Frameworks, da sie nur Erweiterungen von 2.0 sind). Ich landete Abfrage HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET Registrierungsschlüssel und Path Wert des Framework-Schlüssel. Schließlich führte das Anhängen von config\machine.config an den Framework-Pfad zu den gewünschten Ergebnissen.

Die Methode zum Zuordnen der ASP.NET-Laufzeit zum machine.config-Pfad würde Zeichenfolgen in jedem Format "v2.0", "2.0.50727.0" oder nur "v2" und "2" verwenden und sie auf eine Dezimalzahl umstellen Ziffer wie "2.0" oder eine erste Ziffer, wenn Dezimalziffern nicht wie "2" angegeben sind und den richtigen Wert aus der Registrierung erhalten. Etwas ähnliches wie folgt aus:


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"); 

Schließlich gebe ich diese configs WebConfigurationMap (Ich verwende Microsoft.Web.Administration, aber man kann es mit System.Configuration auch verwenden, der Code ist fast das gleiche):


using (ServerManager manager = new ServerManager()) 
{ 
    Configuration rootWebConfig = manager.GetWebConfiguration(new WebConfigurationMap(machineConfigPath, webRootConfigPath), null); 
} 

WebConfigurationMap abbildet Konfiguration benutzerdefinierte machine.config und Wurzel web.config (daher null als zweites Argument in GetWebConfiguration())