C#更改dll.config中的值不会在运行时更改

时间:2014-12-16 08:27:18

标签: c#

我在项目的设置文件中配置了一个布尔变量 当我编译时,在我的输出文件夹中,我看到.dll.config中的变量,如下所示:

      <setting name="ShowStats" serializeAs="String">
            <value>True</value>
      </setting>

在代码中我通过Properties.Settings.Default.ShowStats引用它 我希望能够更改我的.config文件并写入FalseTrue,并将此值反映在运行时中。 似乎只在Visual Studio的“设置”窗口中更改它才能在运行时运行。 用记事本改变是行不通的。它将始终是VS设置窗口中设置的最后一个值。

我在这里做错了什么?

3 个答案:

答案 0 :(得分:5)

Dll实际上没有配置文件。只有输入过程有一个配置文件。基本上:您的条目需要从dll命名的配置文件复制到app.config或exe命名的配置文件。

此外:这些值仅在启动时读取;如果你在运行时更改它,那就不会做任何事情(除非进程选择通过监视配置来重启自己 - asp.net会这样做)。

答案 1 :(得分:1)

.config文件在运行时由ConfigurationManager在启动时读取一次。此外,如果您为应用程序使用主app.config,则需要在dll.config的正确部分标题下实际添加单个app.config值,以便应用程序在运行时。

在运行时更改文件仍然无效,除非您使用手动编写的代码(FileSystemWatcher等)编写应用程序。只更改ASP.NET web.config文件会导致运行时应用程序重新启动,因为它是ASP.NET运行时的一项功能。

答案 2 :(得分:1)

DLL不能有配置文件。虽然它们将由Visual Studio创建,但它们不会在运行时读取。您需要将DLL配置合并到应用程序的配置中。

如果不合并配置,设置将保留其默认值。我在这里已经回答了如何做到这一点:How do I make App.config values visible for referenced ClassLibraires (Assebmlies)(但是,在这种情况下,这不是公认的答案)

请注意:+1代表Settings.Default...代替ConfigurationManager访问设置。

将我的答案中的配置合并到上面链接的问题的示例:让我们假设您的DLL的app.config如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="DLLSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>

    <connectionStrings>
        <add name="DLLSample.Properties.Settings.MyConnectionString" connectionString="Data Source=..." providerName="System.Data.SqlClient" />
    </connectionStrings>

    <applicationSettings>
        <DLLSample.Properties.Settings>
            <setting name="AllowStart" serializeAs="String">
                <value>True</value>
            </setting>
        </DLLSample.Properties.Settings>
    </applicationSettings>
</configuration>

您的应用程序的app.config如下所示:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="App.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <applicationSettings>        
    <App.Properties.Settings>
      <setting name="LogPath" serializeAs="String">
        <value>C:\Temp</value>
      </setting>
    </App.Properties.Settings>
  </applicationSettings>
</configuration>

完成上述更改后,应用程序的配置文件应如下所示:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="App.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      <section name="DLLSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <connectionStrings>
      <add name="DLLSample.Properties.Settings.MyConnectionString" connectionString="Data Source=..." providerName="System.Data.SqlClient" />
  </connectionStrings>

  <applicationSettings>        
    <App.Properties.Settings>
      <setting name="LogPath" serializeAs="String">
        <value>C:\Temp</value>
      </setting>
    </App.Properties.Settings>
    <DLLSample.Properties.Settings>
        <setting name="AllowStart" serializeAs="String">
            <value>True</value>
        </setting>
    </DLLSample.Properties.Settings>
  </applicationSettings>
</configuration>

从您的应用程序和DLL代码中,您将能够使用常规配置设置机制,例如通过DLL代码中的Properties.Settings.Default.AllowStart访问值或从应用程序代码访问Properties.Settings.Default.LogPath

你不能做的两件事:

  1. 从应用程序访问DLL配置值,反之亦然
  2. 从应用程序的属性页面管理DLL配置值。您需要手动编辑app.config以添加/删除/修改设置。