我有一个程序,我将使用 VS 内置的部署包进行部署。
现在我有一个 app.config 文件,我希望用户能够修改它(即使在运行程序之后),但我不知道安装程序究竟在哪里转储文件,而且我不希望用户能够根植他们的文件系统。
我在想的是 - 我要求用户指定一些目录(因为它是一个游戏,无论如何都需要发生) - 我在那里检查配置文件,如果它不在那里,我从程序可以的根目录复制它看 - 然后阅读“保存”文件夹中的那个。
也就是说,它听起来像一个非常丑陋和hacky的解决方案 - 有更好的解决方案吗?
我有一个程序,我将使用 VS 内置的部署包进行部署。
现在我有一个 app.config 文件,我希望用户能够修改它(即使在运行程序之后),但我不知道安装程序究竟在哪里转储文件,而且我不希望用户能够根植他们的文件系统。
我在想的是 - 我要求用户指定一些目录(因为它是一个游戏,无论如何都需要发生) - 我在那里检查配置文件,如果它不在那里,我从程序可以的根目录复制它看 - 然后阅读“保存”文件夹中的那个。
也就是说,它听起来像一个非常丑陋和hacky的解决方案 - 有更好的解决方案吗?
我不会鼓励用户修改 app.config。app.config 被复制到与您的应用程序 exe 相同的目录中,并且通常包含您的应用程序正确运行所依赖的设置,例如数据库连接字符串、系统默认值等。您通过让用户直接更改其中的设置来玩危险的游戏。
更安全的方法是将另一个 XML 文件导出到用户文档文件夹中,他们可以在其中覆盖应用程序设置。首先将您的应用加载到 app.config 中,然后使用用户自己的配置文件中的任何设置覆盖这些值。
我还建议为此实现某种 UI,即使它真的很基础。您的普通用户不会习惯于直接编辑 XML,错误的余地太大。
您可以使用应用程序(或用户)设置来保留用户可能想要在配置中进行的任何更改。请参阅ApplicationSettingsBase
课程和这篇文章。假设您的应用程序包含一个名为 的用户设置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
(用于漫游配置文件)中。