【问题标题】:Letting users edit config file after deployment让用户在部署后编辑配置文件
【发布时间】:2013-03-23 18:46:11
【问题描述】:

我有一个程序,我将使用 VS 内置的部署包进行部署。

现在我有一个 app.config 文件,我希望用户能够修改它(即使在运行程序之后),但我不知道安装程序究竟在哪里转储文件,我不期待用户围绕他们的文件系统进行根目录。

我在想的是 - 我要求用户指定一些目录(因为它是一个游戏,无论如何都需要发生) - 我在那里检查配置文件,如果不在那里,我从根目录复制它程序可以看到 - 然后读取“保存”文件夹中的那个。

也就是说,它听起来像是一个非常丑陋和 hacky 的解决方案 - 还有更好的解决方案吗?

【问题讨论】:

    标签: c# deployment app-config


    【解决方案1】:

    我不会鼓励用户修改 app.config。 app.config 被复制到与您的应用程序 exe 相同的目录中,并且通常包含您的应用程序依赖于正确运行的设置,例如数据库连接字符串、系统默认值等。让用户直接在其中更改设置是在玩危险游戏。

    更安全的方法是将另一个 XML 文件导出到用户文档文件夹中,用户可以在其中覆盖应用程序设置。首先将您的应用加载到 app.config 中,然后使用用户自己的配置文件中的任何设置覆盖这些值。

    我还建议为此实现某种 UI,即使它非常基础。您的普通用户不会习惯直接编辑 XML,错误的余地太大。

    【讨论】:

    • 同意 - 让用户直接编辑 app.config 是自找麻烦,因为您更难处理可能导致的任何异常。如果您推出自己的可序列化类并自己管理其存储,则处理异常会更容易。
    • 有趣,没有考虑到这一点。我想我会推出自己的格式,因为我不太喜欢手动修改 XML,而且我不确定我需要多少参数(可能是吨)
    • 不反对滚动您自己的格式,但是请注意,您还需要滚动自己的序列化程序。 .NET 具有强大的 XML 支持,这将使做这样的事情变得微不足道。
    【解决方案2】:

    您可以使用应用程序(或用户)设置来保留用户可能希望在配置中进行的任何更改。请参阅 ApplicationSettingsBase 类和 this article。 假设您的应用程序包含一个名为 Score 的用户设置,由一个名为 MyUserSettings 的类在内部进行管理:

    public class MyUserSettings : ApplicationSettingsBase
    {
        [UserScopedSetting()]
        [DefaultSettingValue(0)]
        public int Rank
        {
            get
            {
                return (int)this["Score"];
            }
            set
            {
                this["Score"] = value;
            }
        }
    }
    

    您可以保存当前值,通常在主窗体关闭时,使用Save 方法:

    myUserSettings.Save();
    

    如果您希望用户直接修改某些设置,您可以使用属性网格或您自己的表单来绑定MyUserSettings 类的实例。 如果设置被标记为“用户”,那么这些值将存储在user.config 文件中、%InstallRoot%\Documents and Settings\username\Local Settings%InstallRoot%\Documents and Settings\username\Application Data(用于漫游配置文件)中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多