Поскольку мне требовался путь к machine.config для версий ASP.NET, меня не интересовали все пути платформы .NET (например, платформы 3 и 3.5, поскольку они являются просто расширениями 2.0). В итоге я запросил HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET
ключ реестра и Path
значение ключа платформы. Наконец, добавление config\machine.config
к пути платформы дало желаемые результаты.
Метод для сопоставления среды выполнения ASP.NET с путем machine.config будет принимать строки любого формата "v2.0", "2.0.50727.0" или просто "v2" и "2", повторно выражать его в виде одной десятичной цифры как "2.0" или одна первая цифра, если десятичные цифры не были указаны как "2" и получить правильное значение из реестра. Нечто похожее на это:
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");
Наконец, я передаю эти конфиги в WebConfigurationMap (я использую Microsoft.Web.Administration, но вы можете использовать его и с System.Configuration, код почти такой же):
using (ServerManager manager = new ServerManager())
{
Configuration rootWebConfig = manager.GetWebConfiguration(new WebConfigurationMap(machineConfigPath, webRootConfigPath), null);
}
WebConfigurationMap сопоставляет конфигурацию с пользовательским machine.config и корневым web.config (следовательно, null в качестве второго аргумента в GetWebConfiguration ())