Visual Studio 如何在不使用用户设置的情况下在运行时读/写app.config设置?

o75abkj4  于 2022-12-14  发布在  其他
关注(0)|答案(3)|浏览(111)

我正在寻找一种方法来存储应用程序或机器级别的设置,这些设置可以在运行时使用Application Settings写入。用户设置允许读/写,但应用程序设置不允许。我一直在使用用户设置在运行时保存这样的设置,但这已被证明是不切实际的,原因如下:

  • 机器的所有用户都需要共享设置。
  • 在支持呼叫中(特别是在危机情况下),很难向用户/员工解释在哪里手动查找和修改这些设置(appdata是一个隐藏文件夹)。
  • 新版本的应用程序需要使用以前的设置(用户设置似乎被新版本吹走了)。
  • 我们的员工通常会将应用程序复制到新文件夹,这也会重置用户设置。

我们公司的机器只由一个用户使用,所以通常不需要用户特定的设置。
否则,我真的很喜欢使用应用程序设置,并希望继续使用它们,如果可能的话。这将是理想的,如果设置可以驻留在相同的文件夹作为EXE(就像好的ol“ini文件曾经做过)。

**注意:**这是一个WPF应用程序,而不是ASP.net Web应用程序,因此没有web. config。

roejwanj

roejwanj1#

嗯,我还不想在运行时更改应用程序设置(这就是我使用用户设置的目的),但我已经能够在安装时编写应用程序设置。我想类似的方法可能在运行时工作。您可以尝试一下,因为似乎没有任何其他建议的解决方案ATM。

exePath = Path.Combine( exePath, "MyApp.exe" );
    Configuration config = ConfigurationManager.OpenExeConfiguration( exePath );
    var setting = config.AppSettings.Settings[SettingKey];
    if (setting != null)
    {
        setting.Value = newValue;
    }
    else
    {
        config.AppSettings.Settings.Add( SettingKey, newValue);
    }

    config.Save();

希望这对你有帮助!

aoyhnmkz

aoyhnmkz2#

此方法允许您更改**<AppSettings>**中的条目:

internal static bool SetSetting(string Key, string Value)
    {
        bool result = false;
        try
        {
            System.Configuration.Configuration config =
              ConfigurationManager.OpenExeConfiguration(
                                   ConfigurationUserLevel.None);

            config.AppSettings.Settings.Remove(Key); 
            var kvElem= new KeyValueConfigurationElement(Key, Value);
            config.AppSettings.Settings.Add(kvElem);

            // Save the configuration file.
            config.Save(ConfigurationSaveMode.Modified);

            // Force a reload of a changed section.
            ConfigurationManager.RefreshSection("appSettings");                

            result = true;
        }
        finally
        { }
        return result;
    } // function

注意我发现更新后有必要刷新appSettings部分。

该函数在添加键之前删除一个键,以避免重复输入。如果该键以前不存在,也可以这样做。如果有任何错误,它返回false,如果成功,则返回true。读取设置的方法很简单,只是为了完整起见而列出:

internal static string GetSetting(string Key)
    {
        string result = null;
        try
        {
            result = ConfigurationManager.AppSettings[Key];
        }
        finally
        { }
        return result;
    } // function

请注意我已经用try ... finally区块将它括起来以隐藏错误。如果发生任何错误,GetSetting只会传回null,而SetSetting则会传回false。这会让行程更容易,不过如果您需要例外状况,您仍然可以加入

catch (Exception) { throw; }

将异常抛出到调用方。或者,为了调试,您可以添加:

#if DEBUG
        catch (Exception ex) { 
                System.Diagnostics.Debug.WriteLine(ex.ToString()); 
        }
        #endif

如果您选择了“调试”配置,它将在Visual Studio的输出窗口中显示异常,但将继续处理代码。

注(交叉引用类似主题):
*applicationSettings部分是不同的,因为它区分“User”和“Application”作用域,并且它支持不同的数据类型,而不仅仅是字符串。如果你想知道如何处理applicationSettings,你可以在这里找到它(在stackoverflow上):

How to access applicationSettings

vxf3dgd4

vxf3dgd43#

WPF应用程序能够像WinForms应用程序一样通过

ConfigurationManager.OpenExeConfiguration()

诀窍是要在App.config文件的AppSettings标记中包含要访问的值(WPF应用程序中也有)。
所有这些操作的诀窍是确保在修改完属性后调用以下方法:

MyConfig.Save(ConfigurationSaveMode.Modified)
ConfigurationManager.RefreshSection("appSettings")

不久前我写了一个完整的“如何”,解释了这一切here

相关问题