Обновления пользовательского раздела конфигурации не пишут в app.config - PullRequest
3 голосов
/ 09 мая 2011

После большей части дневного исследования я все еще не могу определить, почему следующий код не работает должным образом.

    bool complete = false;
    ...
    Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);                
    BatchCompiler bc = new BatchCompiler(cfg.AppSettings.Settings);

    ... do stuff with bc ...

    // Store the output of the operation.
    BatchCompilerConfiguration bcc = (BatchCompilerConfiguration)ConfigurationManager.GetSection("BatchCompiler");
    bcc.FilesCopied = complete;
    bcc.OutputPath = bc.OutputPath;
    cfg.Save(); // This does not write the modified properties to App.Config.
    //cfg.SaveAs(@"c:\temp\blah.config") // This creates a new file Blah.Config with the expected section information, as it should.

Определение конфигурации BatchCompilerConfiguration:

public sealed class BatchCompilerConfiguration : ConfigurationSection
{
    public BatchCompilerConfiguration()
    {
    }

    public override bool IsReadOnly()
    {
        return false;
    }

    [ConfigurationProperty("filesCopied", DefaultValue = "false")]
    public bool FilesCopied
    {
        get { return Convert.ToBoolean(base["filesCopied"]); }
        set { base["filesCopied"] = value; }
    }

    [ConfigurationProperty("outputPath", DefaultValue = "")]
    public string OutputPath
    {
        get { return Convert.ToString(base["outputPath"]); }
        set { base["outputPath"] = value; }
    }
}        

Вот соответствующие разделы из App.Config:

<configSections>
    <section name="BatchCompiler" type="BatchCompiler.BatchCompilerConfiguration, BatchCompiler" />
</configSections>

<BatchCompiler filesCopied="false" outputPath="" />

Я просмотрел http://www.codeproject.com/KB/dotnet/mysteriesofconfiguration.aspx, соответствующие статьи MSDN и ссылки для ConfigurationManager, а также несколько существующих вопросов, включая:

Я бы не ожидал, что мне придется написать полную реализацию пользовательского элемента для хранения данных, которые я пытаюсь сохранить.Однако, если это единственный способ убедиться, что обновленная информация записана в файл App.Config, я напишу один.Пожалуйста, посмотрите и дайте мне знать, что я пропустил.

1 Ответ

1 голос
/ 20 февраля 2012

Если поиск в Google приводит вас к этому вопросу, обратите внимание на следующее:

ConfigurationManager.GetSection ("BatchCompiler") предоставляет экземпляр BatchCompiler со свойствами, установленными в DefaultValue пользовательских атрибутов класса BatchCompiler.

Однако, только для чтения .Если вы думаете об этом, это имеет смысл.Вы не сказали ConfigurationManager, какой файл использовать, так как вы могли бы сохранить изменения?

BatchCompilerConfiguration позволяет чтение / запись из-за короткого пути в реализации.Оригинальный плакат не должен позволять устанавливать значения, если унаследованный метод IsReadOnly возвращает true.

Чтобы получить раздел для чтения / записи, используйте

BatchCompilerConfiguration sectionconfig =(BatchCompilerConfiguration)ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).Sections["BatchCompiler"];
...