Let’s imagine a common situation at work: you’re creating a library that must access a particular database and provide an interface for client applications to retrieve some data.
Easy, right? Simply create a DLL with App.Config, encrypt the connection string, and you’re good to go. Just call ConfigurationManager.ConnectionStrings[...].ConnectionString to get the connection string. If anything changes, you just change the connection string in one place, re-publish the DLL, and all the new consumers will automatically work.
Right?
Wrong! ConfigurationManager doesn’t (easily) allow you to read connection strings from an App.Config file inside a library. To do that, you need to use this workaround (error checking added):
Configuration config = null;
string exeConfigPath = this.GetType().Assembly.Location;
try
{
string appConfigPath = exeConfigPath.Substring(0, exeConfigPath.LastIndexOf('\\') + 1) + "App.config";
config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
}
catch (Exception e)
{
throw new Exception("Can't read the config file with the connection string. Exception: " + e.Message);
}
if (config != null)
{
if (!config.HasFile)
{
throw new Exception("Config file " + exeConfigPath + " doesn't exist.");
}
KeyValueConfigurationElement element = config.AppSettings.Settings["YourConnectionStringName"];
if (element != null)
{
string value = element.Value;
if (!string.IsNullOrEmpty(value))
{
// For some reason, slashes are quoted (eg. \ is converted to \\)
// De-quote.
return value.Replace(@"\\", @"\");
}
}
throw new Exception("Found config file, but it doesn't have a value for YourConnectionStringName");
}
else
{
throw new Exception("Got an empty config file");
}
The meat of this is really the OpenExeConfiguration line, which will open an App.Config file from a DLL (so long as you have the Copy to Output property on it set to Copy Always). You may also need to wrap everything into a <configuration /> tag.
You will also need a reference to System.Configuration in order to use System.Configuration, but I assume you know that already.