C#:该库的Properties.Settings.Default.ConnectionString返回临时值

时间:2018-08-14 17:13:41

标签: c# visual-studio-2015

我的解决方案中有一个DLL库Configuration,许多应用程序都将该库调用。该库需要与数据库的连接字符串。与其将连接字符串存储在所有应用程序中,我希望将其一次存储在DLL Configuration中。
作为一种解决方案,建议将其存储在DLL库Configuration的属性中。因此,我将其保存在那里并使用以下功能进行阅读:

public string ConnString()
{
    return Properties.Settings.Default.ConnectionString;
}

在调用应用程序中,我成功调用了此函数:

Dim d as new Configuration.ConfigurationRepository("")
msgbox(d.ConnString())

但是现在我想更改DLL中的值,从而更改Configuration.dll.config中的值。但是,当我运行应用程序时,它们将获得旧值Configuration,并且不会更新以获取已手动设置的新值。就像我进入项目Configuration并转到“属性”一样,我得到一个消息框,该值已更改,并且我想更新。然后,即使现在我同意更新并再次运行应用程序,我也会获得更新的值。 Configuration.dll.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="Configuration.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup><applicationSettings>
        <Configuration.Properties.Settings>
            <setting name="ConnectionString" serializeAs="String">
                <value>werwrwerwre</value>
            </setting>
        </Configuration.Properties.Settings>
    </applicationSettings>
</configuration>

如何从DLL Configuration获取配置文件中更新的连接字符串?

1 个答案:

答案 0 :(得分:1)

由于DLL无法包含配置文件,因此您需要“手动”读取dll配置文件中的设置。

这意味着,如果您已将名称为 yourdll.dll.config app.config文件添加到类库项目中,则该配置文件看起来类似于这个:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="ConnectionString" value="verver"/>
  </appSettings>
</configuration>

然后,您需要您的类库以类似于以下方式读取配置文件中的值:

public class Config
{
    public string GetConnectionString()
    {
        Configuration config = null;
        var exeConfigPath = GetType().Assembly.Location;
        try
        {
            config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
        }
        catch (Exception ex)
        {
            //Error handling
        }

        if (config == null) return string.Empty;

        var myValue = GetAppSetting(config, "ConnectionString");
        return myValue;
    }

    private string GetAppSetting(Configuration config, string key)
    {
        var element = config.AppSettings.Settings[key];

        if (element == null) return string.Empty;

        var value = element.Value;
        return !string.IsNullOrEmpty(value) ? value : string.Empty;
    }
}

现在,您可以从其他项目中调用类库(假设您已添加对类库的引用),并以这种方式从其配置文件中读取值:

var config = new Config();
Console.WriteLine(config.GetConnectionString());

值得注意的是,您还需要将 yourdll.dll.config 文件的属性Copy to Output Directory设置为Copy Always