Utilicé un helper de configuración en una DLL compartida, y un archivo app.config en la DLL que usa el elemento Settings.Properties.Default editando el proyecto y configurando la pestaña de configuración. Parece que el valor no se lee a menos que recompile y vuelva a sincronizar el archivo app.config (en el dll) con la configuración del proyecto.
Esto funciona para mí. No recuerdo de dónde obtuve la inspiración. Solo incluyo esta clase en un proyecto compartido en alguna parte. permite que cualquier DLL llame a su propia configuración, lo que le permite cambiar las entradas dllFile.dll.config. Lo uso para cadenas de conexión. La advertencia es que en este método, la cadena de conexión debe ser una cadena de tipo, y no la cadena de conexión especial.
using System;
using System.Configuration;
namespace Shared
{
public static class ConfigurationHelper
{
public static string GetConfigValue(string keyName)
{
string codebase = System.Reflection.Assembly.GetCallingAssembly().CodeBase;
Uri p = new Uri(codebase);
string localPath = p.LocalPath.ToLowerInvariant();
string executingFilename = System.IO.Path.GetFileNameWithoutExtension(localPath);
string sectionGroupName = "applicationSettings";
string sectionName = executingFilename + ".Properties.Settings";
string configName = localPath + ".config";
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = configName;
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
ConfigurationSectionGroup group = config.GetSectionGroup(sectionGroupName);
ClientSettingsSection section = null;
foreach (ClientSettingsSection sect in group.Sections)
{
if (sect.SectionInformation.Name.Equals(sectionName, StringComparison.InvariantCultureIgnoreCase))
{
section = sect;
break;
}
}
SettingElement elem = section.Settings.Get(keyName);
if (elem == null)
return "";
else
return elem.Value.ValueXml.InnerText.Trim();
}
}
}
//in DLL
void foo()
{
var str = ConfigurationHelper.GetSetting("ConnectionStringProd");
}
¿Funcionará si utilizo una sección personalizada? ¿O debo hacer algo en ese código de sección personalizado para admitir el atributo configSource? – Andrey
+1 - ¡Buena respuesta, pásame! –
@Andrey: esto funcionará con ** cualquier ** 'ConfigurationSection' en .NET 2.0 y en el marco. –