c# - 应用程序属性设置缓存在哪里?
问题描述
我最近在尝试使用我构思的控制台应用程序时遇到了一个问题。我已经在 VS2019 项目的“属性”面板中定义了设置,当我想在另一台从未运行过它的计算机上测试该应用程序时,我复制了 exe 和 exe.config 文件,我在 .config 中编辑了设置文件以反映新环境,但是当我运行该应用程序时,我看到它仍然以旧设置启动。
因此,当我查看它时,尝试同时使用Reload()
and Reset()
,但它不会从 .config 文件中加载。我试图查看,AppData\Local\ConsoleAppName
但找不到该文件夹。
然后我尝试了发布向导并尝试了各种发布选项,但没有任何区别,我可以更改这些设置的唯一方法是通过 VS2019 中的属性页面。
我写了以下内容来做一些测试:
using ConsoleApp12.Properties;
using System;
using System.Configuration;
namespace ConsoleApp12
{
class Program
{
public static void PrintParametres()
{
var path = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
Console.WriteLine(path);
foreach (SettingsProperty lSetting in Settings.Default.Properties)
{
Console.WriteLine("{0} = {1}", lSetting.Name, lSetting.DefaultValue);
}
}
static void Main()
{
Settings.Default.Reload();
ConsoleKeyInfo cki;
PrintParametres();
do
{
cki = Console.ReadKey(true);
switch (cki.Key)
{
case ConsoleKey.P:
PrintParametres();
break;
default:
Console.WriteLine("Print P for settings, Ctrl-C or Q to quit.");
break;
}
}
while (cki.Key != ConsoleKey.Q);
Settings.Default.Save();
}
}
}
它生成的唯一文件是 .exe、.exe.config 和 .pdb。在原始的 .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="ConsoleApp12.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.7.2" />
</startup>
<userSettings>
<ConsoleApp12.Properties.Settings>
<setting name="TestSetting" serializeAs="String">
<value>Some text in setting</value>
</setting>
</ConsoleApp12.Properties.Settings>
</userSettings>
</configuration>
如果我将值更改为输出<value>Some other text in setting</value>
,但即使系统文件可见,我也找不到该文件夹,并且属性与设计时定义的匹配,但它们不反映 .config 文件中的更改。path
%userprofile%\appdata\local\AppName\AppName.exe_Url_2543oxfebn2t3ud4uo1qvikliy41i53h\1.0.0.0\user.config
在这种情况下,我真的无法理解。也许我在文档中没有正确理解,或者它可能特定于 Forms 应用程序?现在它是一个控制台应用程序,但目标是提供服务,所以我在这里缺少什么?还是我应该以不同的方式进行?
编辑:这个问题已经被探索过了,答案已经过测试并且没有提供任何解决方案。
解决方案
在设计时设置的设置作为默认值嵌入到可执行文件中(至少这是我似乎从 Reflector 得到的:
[UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("Some text in setting")]
public string TestSetting
{
get =>
((string) this["TestSetting"]);
set =>
(this["TestSetting"] = value);
}
并保持活动设置,除非它被改变。
要在下次执行时保存和使用,必须使用 保存Save()
,此时user.config
文件实际上是在 下生成的AppData\Local\Appname
,但如果在运行时从未更改和保存设置,则不会创建文件。
此外,示例代码会轮询这些默认设置,而不是与设计时设置的设置相同(因此它调用DefaultValue
了它,我在绕圈运行试图了解它是如何工作的之后忽略了它。)。
然而,存储在application.exe.config
文件中的设置似乎不会在任何时候使用。
推荐阅读
- android - 带有内部视图组的 CollapsingToolbarLayout 可防止单击其中的嵌套视图
- junit - 如何为 vertx composit future 或 rxJava 编写 Junit 测试用例
- google-apps-script - 如何使用谷歌脚本连续查找未定义或空单元格?
- c# - 生产服务器上的 NullReferenceException
- indexing - Apache Lucene 8.4.1 如何获取索引字段和术语列表?
- javascript - 如何使用pureJS循环遍历数组并以500ms的间隔显示每个值?
- google-analytics - 每天的多渠道路径响应不是总数
- keras - 我可以在没有训练过程的情况下使用 keras.losses.binary_crossentropy(y_true,y_pred) 吗?
- android - 字体在设备上不会改变,但在模拟器上会改变
- python - 插入排序算法运行时