当 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>
<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]”下
用户设置将以链接应用程序位置的方式存储在您的用户配置文件中。这就是应用程序在移动后找不到设置的原因。
您可以尝试做的是:
- 创建一个名为
SettingsUpgradeRequired
的新用户设置,并在 Visual Studio 的设置设计器中将其设置为 true
。
- 在您的应用程序的启动代码中,检查
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
}
}
您好,我正在使用 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>
<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]”下
用户设置将以链接应用程序位置的方式存储在您的用户配置文件中。这就是应用程序在移动后找不到设置的原因。
您可以尝试做的是:
- 创建一个名为
SettingsUpgradeRequired
的新用户设置,并在 Visual Studio 的设置设计器中将其设置为true
。 - 在您的应用程序的启动代码中,检查
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
}
}