Лучший способ получить путь к machine.config другой версии.NET
Каков наилучший способ получить путь к файлу.net 2.0 machine.config, если приложение работает на.net 4.0?
Одним из способов было бы сделать манипуляции со строками и доступ к файловой системе, чтобы заменить v4.0* на v2.0* в new ConfigurationFileMap().MachineConfigFilename;
а затем передать его ConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(<HERE>))
, Я прибегну к этому решению, если нет ничего лучшего.
1 ответ
Поскольку мне нужен был путь к 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())