因为我需要 ASP.NET 版本的 machine.config 路径,所以我并不关心所有 .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() 中的第二个参数)