11

我已经使用 Visual Studio 2010 的发布功能部署了这个应用程序;它需要保存一些用户设置(例如数据库连接信息),并且有这台特定的计算机以某种方式不断地重置应用程序的设置。最让我困惑的部分是我一直无法弄清楚这是在什么情况下或发生这种情况的原因。我知道设置已正确设置,因为该应用程序在 6 或 7 台其他计算机上运行良好。

什么可能会擦除应用程序的设置?或者,您建议我使用什么来存储这些设置?加密文件?

编辑:我正在使用默认应用程序设置。它们在 app.config 文件中定义。它们可以使用Properties.Settings.Default.propertyName

4

4 回答 4

7

如果您有用户级设置,ClickOnce 应该在用户获得更新时将它们复制到下一个版本的缓存中。在某些情况下,它不会向前复制文件,例如当您更改证书时。

应用程序级别的设置不会保留并继续到下一个版本。

我不建议使用这种机制并依赖它。您可能想查看这篇关于保护您的数据免受 ClickOnce 更新影响的文章。我们推出了自己的配置管理器,并将数据存储为 XML 并按照该文章中的说明进行存储。这样,您可以控制数据发生的情况。

唯一的缺点是当用户卸载应用程序时,它会留下这些数据。另一方面,当用户卸载应用程序时,它会留下他的数据,所以如果他因为遇到问题而卸载它,或者因为遇到问题而清除了 ClickOnce 缓存,那么当他安装新版本时,他的数据还在。

于 2012-08-25T07:00:49.320 回答
2

当您更新应用程序时,您的工作就是升级以前的设置。

Settings.Default.GetPreviousVersion()并且Settings.Default.Upgrade()可以对此有所帮助。

于 2012-08-21T19:53:48.723 回答
1

我想出了一个解决方案,可以帮助未来的开发人员解决这个问题。我意识到,出于某种原因,更新版本读取了一些以前的配置设置,但不是最后一个。例如,如果您有此应用程序文件夹:

myapp_0000000000000000_0001.0000_a4e7e981ca9c18fa
myapp_0000000000000000_0001.0000_a4e7e981ca9c19ee
myapp_0000000000000000_0001.0000_a4e7e981ca9c20aa

更新时,配置设置是从与上一个不同的某个随机文件夹复制的(我不知道这是否是随机的,可能会采用最旧的,但我不确定)。

因此,如果您删除了其他文件夹,并且只保留了最后一个版本,那么当您更新时,除了从这个仅有的一个文件夹中获取配置设置之外别无选择。自己试试吧。

所以我制作了这个每次应用程序启动时运行的代码片段,它删除了旧版本的文件夹,所以当下一次更新到来时,一切都会正常工作。

private void ClearOldConfigurations()
{
    var level = ConfigurationUserLevel.PerUserRoamingAndLocal;
    var configuration = ConfigurationManager.OpenExeConfiguration(level);
    var configurationFilePath = configuration.FilePath;

    var routePieces = configurationFilePath.Split(Path.DirectorySeparatorChar);

    var toRetainFolder = string.Empty;
    var toClearFolder = string.Empty;
    for (int i = routePieces.Length - 1; i > 1; i--)
    {
        if (routePieces[i].ToLower() == "data")
        {
            toRetainFolder = string.Join(Path.DirectorySeparatorChar.ToString(), routePieces.Take(i));
            toClearFolder = string.Join(Path.DirectorySeparatorChar.ToString(), routePieces.Take(i - 1));
            break;
        }
    }

    if (string.IsNullOrWhiteSpace(toRetainFolder) || string.IsNullOrWhiteSpace(toClearFolder))
    {
        return;
    }

    foreach (var dir in Directory.GetDirectories(toClearFolder))
    {
        if (dir.ToLower().Trim() != toRetainFolder.ToLower().Trim())
        {
            try
            {
                Directory.Delete(dir, true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

可能不是最干净的解决方案,但对我有用。

于 2018-10-19T23:31:45.763 回答
1

对于遇到此问题的任何人:检查您是否有无条件

Properties.Settings.Default.Upgrade();

在你的代码中。在具有多个版本的 ClickOnce 安装中,此语句从以前的版本复制用户设置并覆盖上次会话中保存的任何设置。正确的模式是:

if (Properties.Settings.Default.UpgradeRequired)
{
    Properties.Settings.Default.Upgrade();
    Properties.Settings.Default.UpgradeRequired = false;
    Properties.Settings.Default.Save();
}

whereUpgradeRequired是一个默认为 true 的设置。

于 2019-08-24T15:02:48.000 回答