【问题标题】:Use ConfigurationManager to read generated config XML string使用 ConfigurationManager 读取生成的配置 XML 字符串
【发布时间】:2017-04-10 08:42:33
【问题描述】:

我正在以编程方式生成一个配置文件。

Program.cs

string config = new ConfigBuilder().GenerateConfigFile(false);

ConfigBuilder.cs

public string GenerateConfigFile(bool isSettingEnabled)
{
    return "<configuration>...</configuration>";
}

结果

<configuration>
  <appSettings>
    <add key="IsSettingEnabled" value="false" />
  </appSettings>
</configuration>

使用 ConfigurationManager 之类的东西,我希望无需先将文件写入磁盘即可从配置变量中读取设置。换句话说,做类似的事情:

ConfigurationManager.OpenFromMemory(config);
var isSettingEnabled = ConfigurationManager.AppSettings["IsSettingEnabled"];

但是,ConfigurationManager 似乎只能处理文件。

有没有一种简单的方法来解释配置而无需自己解析 XML?

【问题讨论】:

  • 如果您只打算将生成的配置文件保存在内存中,那么为什么不只维护一个简单的字典呢?或者,您最终希望将此配置文件写入磁盘?
  • 发生的事情比我所展示的要多。我只是试图让示例保持清晰并专注于以下问题:我可以读取作为字符串 iso 文件的配置吗?
  • 对。无论如何,这是不可能的。 ConfigurationManager 类本身并不读取配置。我们使用不同方法(OpenExeConfiguration、OpenMappedConfiguration 等)获得的文件路径最终被 Configuration 类用于从文件路径读取物理文件。因此,您不可能在内存流等中拥有配置并使用 ConfigurationManager 读取它。如果您打算使用 ConfigurationManager 类,您最终必须将其保存到磁盘

标签: c# xml


【解决方案1】:

我不相信你能做到这一点,所以我所做的是创建了一个IDisposable 包装类,它将配置数据存储在磁盘上的一个临时文件中,并在处理包装类时进行清理。

看起来像这样:

sealed class ConfigurationGenerator : IDisposable
{
    private string _tempFileName;

    public ConfigurationGenerator(string configurationData)
    {
        if (String.IsNullOrEmpty(configurationData)) throw new ArgumentNullException("configurationData");
        _tempFileName = Path.GetTempFileName();
        File.WriteAllText(_tempFileName, configurationData);
    }

    public System.Configuration.Configuration Generate()
    {
        var filemap = new ExeConfigurationFileMap
        {
            ExeConfigFilename = _tempFileName
        };
        var config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None);
        return config;
    }

    public void Dispose()
    {
        if (_tempFileName != null)
        {
            string s = _tempFileName;
            _tempFileName = null;
            File.Delete(s);
        }
    }
}

然后你像这样使用它:

using(var configGenerator = new ConfigurationGenerator(configData))
{
    Configuration configuration = configGenerator.Generate();

    ... use the configuration data here ...
}

【讨论】:

  • 应该是“使用(var configGenerator = new ConfigurationGenerator(configData))
猜你喜欢
  • 2012-07-10
  • 2011-06-06
  • 2013-01-09
  • 2019-06-19
  • 2015-02-28
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多