app.config -如何在运行时从文件强制加载

本文关键字:文件 加载 运行时 config app | 更新日期: 2023-09-27 18:18:33

我创建了一个命令行应用程序,并将其大量配置移到标准设置文件中。所有设置都声明为Scope = Application,因为应用程序中的逻辑没有任何特定于用户的内容。我使用

访问整个代码中的值
Properties.Settings.Default.<whatever>  

这工作得很好,因为它会自动按时间表运行。配置文件中的更新值将反映在输出中。
过了一段时间,我创建了一个基本GUI(在相同的名称空间中)来直接启动命令行应用程序(通过一个单独的构造函数)。我没有做过大量的。net编程,但我基本上使用我的CLI应用程序,如DLL(我不知道是否有一个合适的术语;在我的输出文件夹中,所有我需要的是GUI.exe, CLI.exe和CLI.exe.config,它的工作)。然而,我注意到,当以这种方式启动时,CLI.exe.config文件没有加载;CLI应用程序只使用其编译的默认值。我希望配置文件方法能在这种情况下工作。
我尝试了以下方法来强制加载配置文件,但到目前为止都是空白的:

<标题> 1:
ConfigurationManager.RefreshSection("appSettings")  
<标题> 2:
ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".exe.config");
ConfigurationManager.OpenMappedExeConfiguration(configFile, ConfigurationUserLevel.None).Save(ConfigurationSaveMod.Modified);  
ConfigurationManager.RefreshSection("appSettings");  
<标题> 3:
Properties.Settings.Default.Reload();  

这些都不会产生错误,但是我在配置文件中修改的Properties.Settings.Default.Value没有更新。有什么方法可以达到我的目的吗?

编辑:这里是我的CLI.exe.config文件的一个示例,如果它有助于说明我在这里要完成的任务:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="CLI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <connectionStrings/>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <applicationSettings>
    <CLI.Properties.Settings>
      <setting name="URLBase" serializeAs="String">
        <value>https://cloud.mycompany.com/</value>
      </setting>
      <setting name="URLPage" serializeAs="String">
        <value>/inventory.aspx#view/Invoice/</value> <!-- This is the value I'm trying to change -->
      </setting>
...

我还应该提到,我也尝试了'applicationSettings'代替'appSettings'在上面的代码。

app.config -如何在运行时从文件强制加载

确保访问修饰符已设置为public。如果GUI.EXE触发了'GetExecutingAssembly',那么它将不会加载CLI配置,因为这是正在执行的程序集。看看这个:

通过exe访问应用程序配置

实际的config文件将有您的运行时设置将取决于您的应用程序的入口点。

如果你直接启动CLI.exe,它将使用用户本地应用程序数据文件夹内的子文件夹中的用户设置文件,类似于:

AppData'Local'CLI'CLI.exe'1.2.3.4'user.config

但是,如果使用引用GUI.exe的不同入口点(CLI.exe),则所有对Properties.Settings的调用将使用完全不同的user.config实例,位于(类似于):

AppData'Local'GUI'GUI.exe'1.2.3.4'user.config

应用程序范围的设置文件(.exe.config),它放在你的输出文件夹中,在可执行文件旁边,只提供默认设置用于这些用户设置,或只读的应用程序设置。允许应用程序写入该文件意味着它将具有对Program Files子文件夹的写访问权限,如果没有提升的权限,这是不可能的。

当您更改入口点时,获得相同用户设置的最简单解决方案是将user.config文件从CLI应用程序数据文件夹复制到新入口点的相应文件夹。

(更新应用设置)

对于应用程序设置(即输出文件夹中的.config文件)的工作原理相同。如果你原来有:

<!-- CLI.exe.config -->
<configuration>
    <!-- setting section definitions -->
    <configSections>
        <sectionGroup name="userSettings" ... >
            <section name="CLI.CliSettings" ... />
        </sectionGroup>
        <sectionGroup name="applicationSettings" ... >
            <section name="CLI.CliSettings" ... />
        </sectionGroup>
    </configSections>
    <!-- defaults for user settings (runtime changes are stored to appdata) -->
    <userSettings>
        <CLI.CliSettings>
            <setting name="SomeUserCliSetting" serializeAs="String">
                <value>Some CLI user setting</value>
            </setting>
        </CLI.CliSettings>
    </userSettings>
    <!-- application settings (readonly) -->
    <applicationSettings>
        <CLI.CliSettings>
            <setting name="SomeAppCliSetting" serializeAs="String">
                <value>Some CLI app setting</value>
            </setting>
        </CLI.CliSettings>
    </applicationSettings>
</configuration>

你的GUI.exe.config是:

<!-- GUI.exe.config -->
<configuration>
    <configSections>
        <sectionGroup name="userSettings" ... >
            <section name="GUI.GuiSettings" ... />
        </sectionGroup>
        <sectionGroup name="applicationSettings" ... >
            <section name="GUI.GuiSettings" ... />
        </sectionGroup>
    </configSections>
    <userSettings>
        <GUI.GuiSettings>
            <setting name="SomeGuiUserSetting" serializeAs="String">
                <value>Some GUI user setting</value>
            </setting>
        </GUI.GuiSettings>
    </userSettings>
    <applicationSettings>
        <GUI.GuiSettings>
            <setting name="SomeGuiAppSetting" serializeAs="String">
                <value>Some GUI app setting</value>
            </setting>
        </GUI.GuiSettings>
    </applicationSettings>
</configuration>

那么你得到的。config文件应该包含所有的部分:

<!-- GUI.exe.config -- merged configuration sections -->
<configuration>
    <configSections>
        <sectionGroup name="userSettings" ... >
            <section name="GUI.GuiSettings" ... />
            <section name="CLI.CliSettings" ... />
        </sectionGroup>
        <sectionGroup name="applicationSettings" ... >
            <section name="GUI.GuiSettings" ... />
            <section name="CLI.CliSettings" ... />
        </sectionGroup>
    </configSections>
    <userSettings>
        <GUI.GuiSettings>
            <setting name="SomeGuiUserSetting" serializeAs="String">
                <value>Some GUI user setting</value>
            </setting>
        </GUI.GuiSettings>
        <CLI.CliSettings>
            <setting name="SomeUserCliSetting" serializeAs="String">
                <value>Some CLI user setting</value>
            </setting>
        </CLI.CliSettings>
    </userSettings>
    <applicationSettings>
        <GUI.GuiSettings>
            <setting name="SomeGuiAppSetting" serializeAs="String">
                <value>Some gui app setting</value>
            </setting>
        </GUI.GuiSettings>
        <CLI.CliSettings>
            <setting name="SomeAppCliSetting" serializeAs="String">
                <value>Some CLI app setting</value>
            </setting>
        </CLI.CliSettings>
    </applicationSettings>
</configuration>

(我可能在写这个的时候混淆了一些值,但是你明白了)。

还有一个我通过谷歌找到的工具:XmlConfigMerge on CodeProject -我没有尝试过,但可能它会自动做同样的事情,所以你可能想要检查出来并将其包含到你的构建脚本