No puedo ver un archivo app.config generado para una biblioteca de clases por el asistente VS2008. En mi investigación encontré que en una aplicación solo existe una app.config.
¿Es malo agregar un app.config manualmente a una biblioteca de clases o existen otros métodos que sirvan para el propósito de un app.config en la biblioteca de clases?
Necesito almacenar la información de configuración de log4net dentro del archivo app.config.
Respuestas:
Por lo general, no debe agregar un
app.config
archivo a un proyecto de biblioteca de clases; no se usará sin doblar y torcer dolorosamente de su parte. No daña el proyecto de la biblioteca en absoluto, simplemente no hará nada en absoluto.En su lugar, configura la aplicación que está usando su biblioteca; por lo que la información de configuración requerida iría allí. Es probable que cada aplicación que pueda usar su biblioteca tenga diferentes requisitos, por lo que esto también tiene sentido lógico.
fuente
No sé por qué aún no se ha dado esta respuesta:
En general, diferentes personas que llaman a la misma biblioteca utilizarán diferentes configuraciones. Esto implica que la configuración debe residir en la aplicación ejecutable y no en la biblioteca de clases.
Puede crear una app.config dentro del proyecto de biblioteca de clases. Contendrá configuraciones predeterminadas para los elementos que cree dentro de la biblioteca. Por ejemplo, contendrá cadenas de conexión si crea un modelo de Entity Framework dentro de la biblioteca de clases.
Sin embargo, esta configuración no será utilizada por la aplicación ejecutable que llame a la biblioteca. En su lugar, estas configuraciones se pueden copiar del archivo library.dll.config al app.config o web.config de la persona que llama, de modo que se puedan cambiar para que sean específicas de la persona que llama y del entorno en el que se encuentra la persona que llama. desplegada.
Así ha sido con .NET desde el primer día.
fuente
Jon, se han dado muchas opiniones que no respondieron correctamente a tu pregunta.
Le daré MI OPINIÓN y luego le diré cómo hacer exactamente lo que pidió.
No veo ninguna razón por la que un ensamblado no pueda tener su propio archivo de configuración. ¿Por qué el primer nivel de atomicidad (¿es una palabra real?) Está en el nivel de la aplicación? ¿Por qué no a nivel de solución? Es una decisión arbitraria, acertada y, como tal, una OPINIÓN. Si tuviera que escribir una biblioteca de registro y quisiera incluir un archivo de configuración para ella, que se usaría globalmente, ¿por qué no podría conectarse a la funcionalidad de configuración incorporada? Todos lo hemos hecho ... hemos intentado proporcionar una funcionalidad "potente" a otros desarrolladores. ¿Cómo? Haciendo suposiciones que se traducen inherentemente en restricciones. Eso es exactamente lo que hizo MS con el marco de configuración, así que tienes que "engañarlo" un poco.
Para responder directamente a su pregunta, simplemente agregue el archivo de configuración manualmente (xml) y asígnele un nombre que coincida con su biblioteca e incluya la extensión "config". Ejemplo:
MyDomain.Mylibrary.dll.Config
A continuación, utilice ConfigurationManager para cargar el archivo y acceder a la configuración:
string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath; Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath); string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;
Tenga en cuenta que esto es totalmente compatible con la jerarquía machine.config, aunque haya elegido explícitamente el archivo de configuración de la aplicación. En otras palabras, si la configuración no está allí, se resolverá más alto. La configuración también anulará las entradas de machine.config.
fuente
De hecho, la biblioteca de clases que está implementando está recuperando información de app.config dentro de la aplicación que la consume, por lo que la forma más correcta de implementar la configuración para las bibliotecas de clases en .net en VS es preparar app.config en el aplicación para configurar todo lo que consume, como la configuración de bibliotecas.
He trabajado un poco con log4net, y descubrí que el que preparaba la aplicación siempre tenía una sección para la configuración de log4net dentro de main app.config .
Espero que encuentre esta información útil.
Nos vemos y publica comentarios sobre la solución que encontraste.
EDITAR:
En el siguiente enlace tiene una aplicación.config con la sección para log4net:
http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx
fuente
app.config
se carga desde el programa real que eventualmente se ejecuta ... no desde las bibliotecas de clases individuales. Francamente, es un poco confuso cuántos no conocen este hecho tan básico.Si desea configurar el registro de su proyecto usando log4Net, mientras usa una biblioteca de clases, no hay necesidad real de ningún archivo de configuración. Puede configurar su registrador log4net en una clase y puede usar esa clase como biblioteca.
Como log4net ofrece todas las opciones para configurarlo.
Encuentre el código a continuación.
public static void SetLogger(string pathName, string pattern) { Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); PatternLayout patternLayout = new PatternLayout(); patternLayout.ConversionPattern = pattern; patternLayout.ActivateOptions(); RollingFileAppender roller = new RollingFileAppender(); roller.AppendToFile = false; roller.File = pathName; roller.Layout = patternLayout; roller.MaxSizeRollBackups = 5; roller.MaximumFileSize = "1GB"; roller.RollingStyle = RollingFileAppender.RollingMode.Size; roller.StaticLogFileName = true; roller.ActivateOptions(); hierarchy.Root.AddAppender(roller); MemoryAppender memory = new MemoryAppender(); memory.ActivateOptions(); hierarchy.Root.AddAppender(memory); hierarchy.Root.Level = log4net.Core.Level.Info; hierarchy.Configured = true; }
Ahora, en lugar de llamar a XmlConfigurator.Configure (new FileInfo ("app.config")), puede llamar directamente a SetLogger con la ruta y el patrón deseados para configurar el registrador en la función de inicio de la aplicación Global.asax.
Y use el siguiente código para registrar el error.
public static void getLog(string className, string message) { log4net.ILog iLOG = LogManager.GetLogger(className); iLOG.Error(message); // Info, Fatal, Warn, Debug }
Al usar el siguiente código, no necesita escribir una sola línea ni en la aplicación web.config ni dentro de la aplicación.config de la biblioteca.
fuente
En realidad, en algunos casos excepcionales, puede almacenar app.config en bibliotecas de clases (agregando manualmente) y analizarlo mediante OpenExeConfiguration .
var fileMap = new ExeConfigurationFileMap {ExeConfigFilename = @"C:\..somePath..\someName.config"}; System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
Realmente debería estimar la necesidad real de esto. Para datos abstractos no es la mejor solución, ¡pero las "Secciones de configuración" podrían ser muy útiles!
Por ejemplo, organizamos nuestra arquitectura WCF de N-Tier desacoplada, sin metadatos, simplemente usando Unity Container e Injection Factory basados en Channel Factory T. Agregamos dll de ClassLibrary externos con solo [Service Contract] Interfaces y app.config común en orden para leer los puntos finales de la sección del cliente y agregarlos / cambiarlos fácilmente en un solo lugar.
fuente
Desea agregar App.config a su biblioteca de clases de pruebas , si está utilizando un trazador / registrador. De lo contrario, no se registra nada cuando ejecuta la prueba a través de un corredor de prueba como TestDriven.Net.
Por ejemplo, lo uso
TraceSource
en mis programas, pero la ejecución de pruebas no registra nada a menos que agregue un archivo App.config con la configuración de seguimiento / registro a la biblioteca de clases de prueba también.De lo contrario, agregar App.config a una biblioteca de clases no hace nada.
fuente
Su respuesta para una creación no manual de un app.config es la pestaña Propiedades / Configuración del proyecto de Visual Studio.
Cuando agrega una configuración y la guarda, su app.config se creará automáticamente. En este punto, se genera un montón de código en un espacio de nombres { yourclasslibrary .Properties } que contiene las propiedades correspondientes a su configuración. La configuración en sí se colocará en la configuración de applicationSettings de app.config.
<configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="ClassLibrary.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <ClassLibrary.Properties.Settings> <setting name="Setting1" serializeAs="String"> <value>3</value> </setting> </BookOneGenerator.Properties.Settings> </applicationSettings>
Si agregó una configuración de ámbito de aplicación llamada Configuración1 = 3, se creará una propiedad llamada Configuración1. En la compilación, estas propiedades se están convirtiendo en parte del binario y están decoradas con un DefaultSettingValueAttribute que se establece en el valor que especificó en el momento del desarrollo.
[ApplicationScopedSetting] [DebuggerNonUserCode] [DefaultSettingValue("3")] public string Setting1 { get { return (string)this["Setting1"]; } }
Por lo tanto, como en el código de su biblioteca de clases, hace uso de estas propiedades, si no existe una configuración correspondiente en el archivo de configuración de tiempo de ejecución, utilizará el valor predeterminado. De esa manera, la aplicación no fallará por no tener una entrada de configuración, lo cual es muy confuso la primera vez que no sabes cómo funcionan estas cosas. Ahora, se está preguntando cómo se puede especificar nuestro propio valor nuevo en una biblioteca implementada y evitar que se utilice el valor de configuración predeterminado.
Eso sucederá cuando configuremos correctamente el archivo app.config del ejecutable. Dos pasos. 1. le informamos que tendremos una sección de configuración para esa biblioteca de clases y 2. con pequeñas modificaciones pegamos el archivo de configuración de la biblioteca de clases en la configuración ejecutable. (hay un método en el que puede mantener el archivo de configuración de la biblioteca de clases externo y simplemente hacer referencia a él desde la configuración del ejecutable.
Entonces, puede tener un app.config para una biblioteca de clases, pero es inútil si no lo integra correctamente con la aplicación principal. Vea aquí lo que escribí hace algún tiempo: enlace
fuente
No se agrega automáticamente el archivo app.config cuando agrega un proyecto de biblioteca de clases a su solución.
Que yo sepa, no hay ninguna contraindicación sobre hacerlo manualmente. Creo que este es un uso común.
Acerca de la configuración de log4Net, no tiene que poner la configuración en app.config, puede tener un archivo conf dedicado en su proyecto, así como un archivo app.config al mismo tiempo.
este enlace http://logging.apache.org/log4net/release/manual/configuration.html le dará ejemplos sobre ambas formas (sección en app.config y archivo de configuración de log4net independiente)
fuente
app.config
proyecto de biblioteca, no. Pero tampoco se utilizará.Recomendaría usar Properties.Settings para almacenar valores como ConnectionStrings y así sucesivamente dentro de la biblioteca de clases. Aquí es donde se almacenan todas las cadenas de conexión por sugerencia de Visual Studio cuando intenta agregar un adaptador de mesa, por ejemplo. ingrese la descripción de la imagen aquí
Y luego serán accesibles usando este código en todas partes de la biblioteca clas
var cs= Properties.Settings.Default.[<name of defined setting>];
fuente