如何加载当前 web.config/app.config as XML

How can I load the current web.config/app.config as XML

我正在尝试使用当前 app/webapp 配置文件中的标准 XmlSerializer 加载自定义部分。

以下解决方案不适用于网络应用程序:

var configFilePath =
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
    .FilePath;

if (configFilePath == null || !File.Exists(configFilePath))
    return null;

var xdoc = XDocument.Load(configFilePath);

var section =
    xdoc.Root?.Element("ParentSection")?.Element("MySection");

if (section == null)
    return null;

var serializer = new XmlSerializer(typeof(MyConfigType));

MyConfigType config;

using (var reader = new StringReader(section.ToString()))
{
    config = serializer.Deserialize(reader) as MyConfigType;
}

如何在不检查当前应用程序是否为网络应用程序的情况下轻松完成此操作?

(不使用 System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration?)

配置文件路径可以这样解析:

var configFilePath =
    AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

根据 Sean's deleted answer 对不同问题的回答

另一种使用反射的方法(未测试):

// Initialize ConfigurationManager
var dummy = ConfigurationManager.AppSettings;

object configSystem = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
object configHost = configSystem.GetType().GetField("_configHost", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(configSystem);
object configPaths = configHost.GetType().GetProperty("ConfigPaths", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(configHost);
string path = (string)configPaths.GetType().GetProperty("ApplicationConfigUri", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(configPaths);