首次运行程序时,如何写出配置的空白版本?

时间:2014-01-13 10:51:03

标签: c# settings.settings

我一直在c#中创建一个命令行工具,我们最终使用了一些配置,只需要设置一次。我没有为这些提供UI,而是设置了一个空白配置,如果没有设置值,请提供一条消息说明配置的位置并设置它们。

结果非常困难!

我需要做的事情如下:

  • 获取配置路径
  • 使用相关属性的存根保存空白配置

该工具正在使用CC.net发布,并使用wix创建了一个msi。不幸的是,这是相关的!

2 个答案:

答案 0 :(得分:0)

获取配置路径

这一点非常简单:

你只是使用这样的东西:

    public string FileLocation
    {
        get { return Configuration.FilePath; }
    }

    private static Configuration Configuration
    {
        get { return OpenConfig(ConfigurationUserLevel.PerUserRoamingAndLocal); }
    }

    private static Configuration OpenConfig(ConfigurationUserLevel userLevel)
    {
        return ConfigurationManager.OpenExeConfiguration(userLevel);
    }

在那里传递的枚举还有另外两个值:无似乎指向app.config的位置,而PerUserRoaming似乎总是指向某个不存在的地方。我无法找到关于什么时候这可能适合使用的更多细节,但就我而言似乎并非如此。

如上所述,关于此调用的一个令人困惑的事情是它将返回文件的路径如果保存/存在。这意味着通常这个文件不存在! ConfigurationManager和Settings(从ApplicationSettingsBase派生的自动生成的类)之间的关系不明确,这让我感到非常痛苦!

保存空白配置

一些绊脚石如下:

如果添加settings.Settings类,这也将添加app.config。除非您使用已安装的程序发送此程序,否则您将看到已安装的程序版本与开发版本之间的不同行为 - 一个将使用app.config中的值创建设置文件,另一个不会。对我来说最简单的解决方案是完全删除app.config。

我试图在Configuration上使用save方法,它允许您指定保存所有属性(无论值是否为默认值),并允许您指定即使未修改配置也要保存。但是,使用这两个标志设置调用此方法将不会执行任何操作 - 看起来您在设计器中以某种方式创建的设置在设置之前是不真实的 - 配置和ConfigurationManager是较旧的处理方式,而ApplicationSettingsBase可能使用一个或两个他们没有很好地整合。

为了使其更加混乱,如果您查询设置,那么它们将具有值(对于它们将具有的字符串“”)。但是,如果保存设置,则这些设置不会保存到文件中指定的位置!实际上根本不会创建任何文件!虽然如果你有一个app.config,如果你使用上面的强制保存方法将创建一个文件,因为在app.config中指定了默认值!

解决方案似乎是检查每个属性中的默认值,然后设置默认值。这看起来应该是一个无操作但是getter不遵循'如果我没有设置我将在查询时创建它'的逻辑而不是它只是假装存在一个默认值。设置任何值似乎实际上创建了设置。

        var somethingUnSet = _settings.Something == "";
        if (somethingUnset)
            _settings.Something = "";

        if(somethingUnset|| somethingElseUnset)
        {
            _settings.Save();
            ExitWithError("config needs setting up at " + _settings.FileLocation);
            return;
        }  

最后,这给了我想要的结果 - 文件被保存在配置管理器指定的位置,并带有需要填充的空属性。想想UI会更快!!! \ / p>

我正在使用一个包装的Settings对象来帮助更改测试中的值而无需处理单例。这也有很好的副作用,你可以在额外的代码(如文件位置)上,而不必担心代码生成覆盖东西时添加更多的设置。

答案 1 :(得分:0)

首先将.config文件中的所有项目设置为空,如:

ConfigurationManager.appSettings["item1"] = ""; 

并检查价值。

但为什么你只是检查参数是否设置,如果没有抛出错误,我认为你不需要清除配置文件来检查它是否第一次启动