C# app.config-如何在运行时强制从文件加载?
我创建了一个命令行应用程序,并将其许多配置移到一个标准设置文件中。所有设置都声明为Scope=Application,因为应用程序中的逻辑没有用户特定的内容。我使用C# app.config-如何在运行时强制从文件加载?,c#,.net,xml,app-config,C#,.net,Xml,App Config,我创建了一个命令行应用程序,并将其许多配置移到一个标准设置文件中。所有设置都声明为Scope=Application,因为应用程序中的逻辑没有用户特定的内容。我使用 Properties.Settings.Default.<whatever> 2: 三: 所有这些都不会产生错误,但我在配置文件中修改的Properties.Settings.Default.Value不会更新。有没有办法完成我在这里需要的东西 编辑:下面是我的CLI.exe.config文件的一个示例,如果它有助
Properties.Settings.Default.<whatever>
2:
三:
所有这些都不会产生错误,但我在配置文件中修改的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>
...
我还应该提到,我也尝试过用“应用程序设置”代替上面代码中的“应用程序设置”。确保访问修饰符已设置为公共。如果GUI.EXE触发了CLI配置,则使用“GetExecutionGassembly”启动将不会加载该配置,因为这是正在执行的程序集。看看这个: 具有运行时设置的实际配置文件将取决于应用程序的入口点 如果直接启动CLI.exe,它将在用户的本地应用程序数据文件夹的子文件夹中使用用户设置文件,类似于:
AppData\Local\CLI\CLI.exe\1.2.3.4\user.config
但是,如果使用不同的入口点CLI.exe(该入口点引用GUI.exe),则对Properties.Settings的所有调用都将使用完全不同的user.config实例,该实例位于以下位置:
AppData\Local\GUI\GUI.exe\1.2.3.4\user.config
应用程序范围的设置文件.exe.config位于可执行文件旁边的输出文件夹中,仅为这些用户设置或只读应用程序设置提供默认设置。允许应用程序写入此文件意味着它将具有对程序文件子文件夹的写入权限,如果没有提升的权限,这是不可能的
更改入口点时获得相同用户设置的最简单解决方案是将user.config文件从CLI app data文件夹复制到新入口点的相应文件夹
应用程序设置的更新
它同样适用于应用程序设置,即输出文件夹中的配置文件。如果您最初有:
<!-- 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>
我可能在写这篇文章时混淆了一些价值观,但你明白了
还有一个我通过谷歌搜索找到的工具:-我没有尝试过,但它可能会自动执行相同的操作,因此您可能希望将其签出并包含到构建脚本中。ConfigurationManager.RefreshSectionappSettings适合我。你确定app.config真的更新了吗?Properties.settings中的用户设置不应该与输出文件夹中的.config文件有任何关系,它们存储在用户的本地app data文件夹中。GUI.exe将读取GUI.exe.config而不是cli.exe.config-就这么简单。@MikeMiller我认为这是.Net framework的设计,这是可以理解的,因为我没有直接执行CLI.exe。我需要的是让同样的行为发生though@Groo在编译时,.config文件正好包含作为默认值输入到设置文件中的设置。当我在文件中更改这些设置并直接执行CLI.exe时,我的更改将被反映出来。我只是希望在执行GUI.exe并在CLI中调用相同的方法时发生这种行为。顺便说一句,我不使用.NET应用程序设置的原因很多,比如您发现的原因,或者发布新应用程序版本时遇到的版本控制/升级问题。例如,我们公司的设置类根据dll程序集名称将设置加载并存储到应用程序数据文件夹/文件中,以便每个程序集都有自己的配置文件。但是,尽管如此,在某些情况下,您希望每个入口点对同一程序集具有一组不同的设置,并且使用.NET设置,您可以为每个入口点获得一个新的user.config文件,其中包含所有引用程序集的设置。我检查了AppData文件夹,两个应用程序都没有本地设置;正如我所指出的,所有设置都是应用程序范围,而不是用户范围,因此不需要创建它们。您说可执行文件旁边的设置文件应该提供默认值——这正是我想要的用途,因为这些值在运行时不会更改,但应该事先更改。但是,这并没有发生。@Gargravarr:应用程序设置也一样,您只需要将设置合并到入口点的.config文件中。NET应用程序设置背后的思想是允许每个入口点都有一组单独的配置设置。检查我的编辑。您的编辑看起来不错,但我没有GUI的配置文件,因为它不需要任何配置文件;所有参数都在命令行上传递,例如连接字符串,它对于它运行的每个环境都是不同的,因此这是在快捷方式中设置的。你认为我需要为GUI创建一个配置文件吗?@Gargravarr:如果你没有配置文件
对于GUI,那么您需要做的就是将CLI.exe.config复制到输出文件夹中的GUI.exe.config,或者将app.config从CLI复制到GUI。确保您的分区使用正确的CLI名称空间(如上面示例中的CLI.CliSettings)进行限定非常重要。但是,是的,你也可以为GUI项目创建一个app.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 -->
<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>
<!-- 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>