Лучший способ получить путь к 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())

Другие вопросы по тегам