当 exe 更改位置时应用程序设置重置

Application settings reset when exe changes location

您好,我正在使用 Visual Studio 配置文件,但是每次移动 exe 时设置都会改变。

我该如何解决这个问题?

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="GUIChangerUI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <userSettings>
        <GUIChangerUI.Properties.Settings>
            <setting name="StarmadePath" serializeAs="String">
                <value>default</value>
            </setting>
            <setting name="GuiPath" serializeAs="String">
                <value>Not selected yet.</value>
            </setting>
            <setting name="FirstStart" serializeAs="String">
                <value>True</value>
            </setting>
            <setting name="jpeg" serializeAs="String">
                <value>default</value>
            </setting>
            <setting name="debug" serializeAs="String">
                <value>default</value>
            </setting>
            <setting name="Darktheme" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Lightheme" serializeAs="String">
                <value>True</value>
            </setting>
            <setting name="starmadeStarter" serializeAs="String">
                <value />
            </setting>
            <setting name="_starmadeStarter" serializeAs="String">
                <value />
            </setting>
            <setting name="OSMTheme" serializeAs="String">
                <value>False</value>
            </setting>
        </GUIChangerUI.Properties.Settings>
    </userSettings>
</configuration>

包含已保存配置设置的实际配置文件存储在此处:

%APPDATA%\Local\<application name>\<application name>.<eid>_<hash>\<version>

根据this MSDN article:

<eid> is the URL, StrongName, or Path, based on the evidence available to hash.
<hash> is a SHA1 hash of evidence gathered from the CurrentDomain, in the following order of preference:
StrongName
URL
If neither of these is available, use the .exe path.

(我的重点)

所以解决方案看起来很简单:

Create a strong name and sign your executable.

然后您每次都会获得相同的唯一哈希值,并且无论您何时从新位置启动可执行文件,它都不会改变。

如果您在签署应用程序时需要帮助,请参阅这篇 MSDN 文章:How to: Sign an Assembly with a Strong Name

该行为是设计使然,因为您的应用程序可能有多个版本(例如 QA 版本、PROD 版本等),需要不同的设置存储。另请参阅 Client Settings FAQ 了解详细信息。

如果您需要独立于您应用程序的位置/版本的设置管理,我建议您创建自己的设置文件并将它们存储在“%appdata%[company][application]”下

用户设置将以链接应用程序位置的方式存储在您的用户配置文件中。这就是应用程序在移动后找不到设置的原因。

您可以尝试做的是:

  1. 创建一个名为 SettingsUpgradeRequired 的新用户设置,并在 Visual Studio 的设置设计器中将其设置为 true
  2. 在您的应用程序的启动代码中,检查 SettingsUpgradeRequired 是否为 true,如果是,请执行设置升级。

由于设置文件重置后新设置为真,因此以下应导入旧设置,并且只导入一次:

if (Properties.Settings.Default.SettingsUpgradeRequired)
{
    try
    {
        Properties.Settings.Default.Upgrade();
        Properties.Settings.Default.SettingsUpgradeRequired = false;
        Properties.Settings.Default.Save();
    }
    catch (...)
    {
       ... // Upgrade failed - tell the user or whatever
    }
}