我一直在c#中创建一个命令行工具,我们最终使用了一些配置,只需要设置一次。我没有为这些提供UI,而是设置了一个空白配置,如果没有设置值,请提供一条消息说明配置的位置并设置它们。
结果非常困难!
我需要做的事情如下:
该工具正在使用CC.net发布,并使用wix创建了一个msi。不幸的是,这是相关的!
答案 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"] = "";
并检查价值。
但为什么你只是检查参数是否设置,如果没有抛出错误,我认为你不需要清除配置文件来检查它是否第一次启动