发布了ClickOnce应用程序,它不断重置其设置

时间:2012-08-21 16:02:23

标签: c# visual-studio-2010 settings clickonce publish

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

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

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

访问它们

4 个答案:

答案 0 :(得分:7)

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

不保留应用程序级别设置并将其转发到下一个版本。

我不建议使用此机制并依赖它。您可能想查看this article about keeping your data safe from ClickOnce updates。我们推出了自己的配置管理器,并将数据存储为XML并按照该文章中的说明进行存储。这样,您可以控制数据发生的变化。

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

答案 1 :(得分:2)

更新应用程序时,升级以前的设置是您的职责。

Settings.Default.GetPreviousVersion()Settings.Default.Upgrade()对此有所帮助。

答案 2 :(得分:0)

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

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);
            }
        }
    }
}

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

答案 3 :(得分:0)

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

Properties.Settings.Default.Upgrade();

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

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

其中UpgradeRequired是默认设置为true的设置。