Лучший способ получить путь к machine.config другой версии .NET - PullRequest
1 голос
/ 23 декабря 2010

Как лучше всего получить путь к файлу .net 2.0 machine.config, если приложение работает на .net 4.0?

Один из способов - манипулирование строками и доступ к файловой системе для замены v4.0 * на v2.0 * в new ConfigurationFileMap().MachineConfigFilename; и затем передайте его ConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(<HERE>)). Я прибегну к этому решению, если нет ничего лучшего.

1 Ответ

7 голосов
/ 01 февраля 2011

Поскольку мне требовался путь к 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 ())

...