首页 > 解决方案 > 应用程序属性设置缓存在哪里?

问题描述

我最近在尝试使用我构思的控制台应用程序时遇到了一个问题。我已经在 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 应用程序?现在它是一个控制台应用程序,但目标是提供服务,所以我在这里缺少什么?还是我应该以不同的方式进行?

编辑:这个问题已经被探索过了,答案已经过测试并且没有提供任何解决方案。

标签: c#

解决方案


在设计时设置的设置作为默认值嵌入到可执行文件中(至少这是我似乎从 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文件中的设置似乎不会在任何时候使用。


推荐阅读