app.config para una clase de la biblioteca

No puedo ver una aplicación.archivo de configuración generado por una biblioteca de clases por el VS2008 asistente. En mi investigación, he encontrado que en una aplicación única aplicación.config existe.

Es una mala cosa para agregar una aplicación.manualmente la configuración para una biblioteca de clases o hay otros métodos que sirven al propósito de una aplicación.config en la biblioteca de clases?

Necesito almacenar log4net información de configuración dentro de la aplicación.el archivo config.

  • Usted puede leer el archivo ejecutable archivo de configuración del proyecto de la biblioteca.
InformationsquelleAutor logeeks | 2011-04-15

10 Kommentare

  1. 87

    Generalmente debe no agregar un app.config archivo a un proyecto de biblioteca de clases; no se puede utilizar sin algunos dolorosos flexión y la torsión de su parte. No daño el proyecto de la biblioteca en todos los – simplemente no hacer nada en absoluto.

    Lugar, puede configurar la aplicación que está usando su biblioteca; por lo que la información de configuración necesaria iba a ir allí. Cada aplicación que puede usar la biblioteca probablemente tendrán diferentes requisitos, por lo que esta realidad tiene un sentido lógico, demasiado.

    • Bueno para usted. Yo no estaba respondiendo a su pregunta, sin embargo. Claramente tienen algún tipo cultivados en casa de configuración del sistema que no se aplica a la persona que hace la pregunta aquí.
    • Tengo un Selenium WebDriver de la biblioteca de clases que me quedo de NUnit para todos mis casos de prueba. Yo prefiero no tener que preocuparse acerca de la configuración de la configuración de NUnit. ¿Cómo puedo doblar y torcer a hacer esto? 🙂
    • Lo imaginé… Si el uso de NUnit, el nombre de su aplicación.archivo de configuración con el mismo nombre que su *.nunit proyecto de nombre de archivo. Así, por ejemplo, si usted llama a su proyecto «ClassLibraryA.nunit», entonces el nombre de la biblioteca de clase archivo de configuración «ClassLibraryA.config». Ellos también deben residir en la misma carpeta o directorio. NUnit es en realidad el uso de este como el principal archivo de configuración …. agregar una referencia a System.Configuración (en .Ficha de NET) …. y usa este código: string settingValue = ConfigurationManager.AppSettings[«settingName»];
    • ¿Cómo le recomendamos que ajuste las cosas cuando se tienen pruebas de integración? Me parece lógico tener una aplicación.config en que la biblioteca de pruebas con la cadena de conexión.
    • ¿Qué pasa si usted no puede configurar la aplicación porque no la propia.
    • Al ejecutar las pruebas unitarias (MSTest), acabo de añadir una normal app.config archivo a mi proyecto y se obtiene copia a bin/$(Configuration)/$(AssemblyName).dll.config. El ejecutor de pruebas de carga de tal manera que el ejecutor de pruebas utiliza su propia configuración, pero mi propio código ve mi propia config.
    • No hay dolorosa de flexión y de torsión necesario para utilizar la aplicación.configuración de una biblioteca de clase. No se puede utilizar tal como es, sino en todo el desarrollo es útil. Además de que no contesta directamente la pregunta: «agregar una aplicación.manualmente la configuración de malo, bueno hay alguna forma de hacerlo en un no forma manual?».

  2. 47

    No sé por qué esta respuesta aún no se ha dado:

    Diferentes llamadas de la misma biblioteca, en general, el uso de diferentes configuraciones. Esto implica que la configuración debe residir en la ejecutable de la aplicación, y no en la biblioteca de clase.

    Usted puede crear una aplicación.config dentro del proyecto de biblioteca de clases. Contendrá las configuraciones por defecto para los elementos de crear dentro de la biblioteca. Por ejemplo, contendrá las cadenas de conexión si se crea un modelo de Entity Framework dentro de la biblioteca de clases de.

    Sin embargo, estos valores no serán utilizados por la aplicación ejecutable de llamar a la biblioteca. En su lugar, estos ajustes pueden ser copiados de la biblioteca.dll.archivo de configuración en la aplicación.config o web.config de la persona que llama, por lo que pueden ser modificados para ser específicos a la persona que llama, y el entorno en el que la persona que llama se implementa.

    Esta es la forma en que ha estado con el .NET desde el Día 1.

    • Pero, ¿qué debo hacer si necesito llamar a webserice la funcionalidad de la biblioteca de la clase? VS creado una app predeterminada.configuración, pero mi aplicación se estrelló al intentar llamar webservice función no puede encontrar entradas de configuración de…
    • Tienes que copiar los elementos que se colocaron en la biblioteca de clases de la aplicación.config en la aplicación.config o web.config de la persona que llama de la biblioteca de clase. Esto permite que la persona que llama para tener el control de la configuración. Por ejemplo, la persona que llama ahora puede cambiar la dirección URL del servicio que la biblioteca de clase de las llamadas, y la biblioteca de clase, no saber sobre el cambio.
    • Saunders: «es posible que necesite» son exactamente las palabras adecuadas. Por lo que puede haber situaciones en las opciones de configuración sólo se diferencian por servidor (por ejemplo, cadenas de conexión) y es más conveniente tener el archivo dll tener su propia configuración de copia de ella un montón de veces alrededor de cada asamblea que utiliza el archivo dll. En mi opinión Microsoft/.NETO de uso preferido no es el santo grial. Depende realmente, lo que es más conveniente en un escenario de implementación. No hay necesidad de decirle a Todd fuera, su opinión es tan importante como el tuyo o Microsoft.
    • Estoy muy interesado en esta solución parece ideal para mí. Tiene sentido que la biblioteca podría llevar a la configuración predeterminada, mientras que la aplicación tendría la capacidad para invalidarlas. Podría usted ampliar sobre cómo la configuración se puede propagar a partir de la biblioteca de la aplicación.config para la ejecución de la asamblea de la aplicación.config, o me dirija a un recurso relevante?
    • Se llama «copiar y pegar». El establecimiento inflexible de tipos, función de Configuración .NET puede ayudar un poco, como que se cuece valores predeterminados en la asamblea.
    • Como alguien que ha tenido que tomar más «especial» de código que no quieren seguir a Microsoft/.Net «uso preferido» (aka mejores prácticas) yo diría que no. Siguiendo las mejores prácticas es un santo grial en comparación con la alternativa. Y no, Todd opinión no es tan importante como el de Microsoft.

  3. 37

    Jon, un montón de opinión ha sido dado que no responde correctamente a la pregunta.

    Voy a dar MI OPINIÓN y luego le dirá cómo hacer exactamente lo que usted pidió.

    Veo ninguna razón por la que una asamblea no podía tener su propio archivo de configuración. Por qué es el primer nivel de atomicy (que es una palabra real?) estar en el nivel de aplicación? ¿Por qué no en el ámbito de la solución? Es arbitraria, mejor-supongo decisión y, como tal, una OPINIÓN. Si usted fuera a escribir una biblioteca de registro y quería incluir un fichero de configuración, que sería utilizado en todo el mundo, ¿por qué no agarras el construido-en la configuración de la funcionalidad? Todos lo hemos hecho … tratado de proporcionar «poderosos» de la funcionalidad de otros desarrolladores. Cómo? Haciendo suposiciones que inherentemente traducido a restricciones. Eso es exactamente lo que MS hizo con la configuración del marco, de modo que usted no tiene que «engañar» un poco.

    Responder directamente a su pregunta, simplemente agregar manualmente el archivo de configuración (xml) y el nombre para que coincida con su biblioteca y a incluir la opción «config» de extensión. Ejemplo:

    MyDomain.Mylibrary.dll.Config

    A continuación, utilice el ConfigurationManager para cargar el archivo y la configuración de acceso:

    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 este soporta completamente la máquina.config heierarchy, a pesar de que ha elegido explícitamente la aplicación archivo de configuración. En otras palabras, si el valor no está ahí, va a resolver superior. Configuración de sustituir la máquina.entradas de configuración.

    • También debo mencionar que usted podría tener un evento posterior a la generación que cambió de nombre de la aplicación.config para el final del nombre de archivo, pero la unidad de pruebas de la copia de la aplicación.archivo de configuración en lugar de la final de la final y no ver la configuración.
    • Ugh. Lo siento tan descuidado. Una cosa más: se debe marcar el archivo de configuración como SIEMPRE COPIA y establecer el CONTENIDO.
    • -1: Su opinión es, per se, no es importante. Hechos podrían ser importantes. .NET, desde el Día 1, fue creado para que las personas que llaman de una biblioteca de determinar la configuración de los elementos dentro de la biblioteca. Es la única cosa que hace que el sentido real de la configuración, como diferentes llamadas de la biblioteca pueden necesitar diferentes configuraciones.
    • los llamadores de la biblioteca pueden necesitar diferentes configuraciones.» Exactamente, que «puede» necesidad de configuraciones diferentes, y su lógica hace perfecto sentido en todos los casos en que la configuración no depende de la persona que llama. Pero hay varios casos en los que la configuración es utilizada internamente para la biblioteca de clase, y la configuración es exactamente la misma, no importa lo que la persona es. Si usted tiene 10 aplicaciones que consumen una biblioteca, tiene que ser peor para copiar y pegar exactamente la misma configuración en 10 archivos de configuración.
    • Creo que la palabra que desea es ‘átomos’.
    • En una arquitectura de plugin, se hace realmente sentido si todos los plugins tienen su propio archivo de configuración.
    • hay varios casos en los que la configuración es utilizada internamente para la biblioteca de clase, y la configuración es exactamente la misma, no importa lo que la persona es.» Suena como que esta no es la configuración en todos. Si nunca ha cambiado, entonces ¿por qué necesita ser configurado? Yo diría que hacer que las cosas const o readonly variables, en lugar de las configuraciones en un archivo de configuración.
    • Nadie dijo nunca cambia, sólo que no dependen de la persona que llama de la biblioteca. Config puede cambiar dependiendo de si son de depuración de la biblioteca frente a una versión de producción. Puede cambiar dependiendo del entorno en el que están edificio, etc.
    • Si el nombre de su archivo de app.config obtiene automáticamente a llamarse correctamente VS. Al menos con la versión 2013 (IIRC) y más reciente. ¿Esto realmente no ocurrió en el pasado?
    • En nuestro caso de uso, teniendo el uso de la biblioteca de su propio .archivo de configuración tiene sentido. Hemos creado un C# biblioteca que se accede a través de COM+ a través de un legado de la aplicación ASP. no hay ninguna «de la aplicación.config» debido a que la aplicación que utiliza la biblioteca no es .NET. Voy a darle una oportunidad y ver si cumple con nuestros requisitos.

  4. 7

    Si desea configurar su proyecto de registro de uso de log4Net, mientras que el uso de una biblioteca de clases, no Hay ninguna necesidad real de cualquier archivo de configuración. Puede configurar el registrador de log4net en una clase, y puede utilizar esa clase de la biblioteca.

    Como log4net ofrece todas las opciones para configurarlo.

    Por favor, encontrar el código de abajo.

    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.Configurar(new FileInfo(«app.config»)) usted puede llamar directamente a SetLogger con la ruta deseada y el patrón para establecer el registrador en el Mundial.asax el inicio de la aplicación de la función.

    Y utilizar 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
            }

    Mediante el siguiente código que no existe la necesidad de escribir una sola línea ni en la web de la aplicación.config ni dentro de la aplicación.configuración de la biblioteca.

    • sentí que esta es la mejor respuesta…en lugar de discutir si el archivo de configuración debe ser permitido para una biblioteca…esta respuesta responde a la OP de la cuestión de la utilización de Log4net
    • Aunque la pregunta utilizada log4net como un ejemplo, la pregunta es acerca de configuraciones en general. Yo diría que las respuestas acerca de log4net en realidad son irrelevantes.
  5. 6

    De hecho, la biblioteca de clase son de aplicación, es la recuperación de la información de de la aplicación.config dentro de la aplicación que se está consumiendo, por lo que, de la manera más correcta para aplicar la configuración de bibliotecas de clases en .neto en el VS es preparar de la aplicación.config en la aplicación para configurar todo lo que consume, al igual que las bibliotecas de configuración.

    He trabajado un poco con log4net, y me encontré con que el que preparó la aplicación siempre había una sección para log4net de configuración dentro de main de la aplicación.config.

    Espero que encuentre útil esta información.

    Ver y publicar comentarios acerca de la solución que encontraron.

    EDICIÓN:

    En el siguiente enlace tienes una de la aplicación.config con la sección de log4net:

    http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx

    • +1 Exactamente; El app.config se carga desde el programa que ejecuta finalmente… no de la clase individual de las bibliotecas. Es, francamente, un poco confuso cómo muchos no saben esto muy hecho básico.
    • Tal vez la gente viene de lenguaje Java y hay que tener un log4java.propiedades y separar a un archivo de propiedades para su aplicación.
  6. 4

    De hecho, para algunos raros casos se puede almacenar en la aplicación.config en las bibliotecas de clase (añadiendo manualmente) y analizarlo por OpenExeConfiguration.

     var fileMap =
        new ExeConfigurationFileMap {ExeConfigFilename = 
        @"C:\..somePath..\someName.config"};
     System.Configuration.Configuration config =
        ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
        ConfigurationUserLevel.None);

    Usted realmente debe estimar la necesidad real de este. Para abstracto de datos no es la mejor solución, pero «Config Secciones» podría ser muy útil!!

    Por ejemplo, organizamos nuestra N-Tier WCF arquitectura desacoplada, sin ningún tipo de metadatos, simplemente mediante el uso de la Unidad y el Contenedor de Inyección de Fábrica basado en el Canal de Fábrica T. Hemos añadido externall ClassLibrary archivo dll con la [Contrato de Servicio] Interfaces y de común aplicación.config con el fin de leer los extremos de clientsection, y fácilmente añadir/cambiar en un solo lugar.

  7. 3

    Se desea añadir de la Aplicación.config a su pruebas biblioteca de clase, si usted está usando un trazador/logger. De lo contrario nada se registra al ejecutar la prueba a través de un test runner, tales como TestDriven.Net.

    Por ejemplo, yo uso TraceSource en mis programas, pero la ejecución de pruebas no registro nada menos que puedo añadir un de la Aplicación.config archivo con la traza/configuración de registro para la prueba de biblioteca de clases también.

    De lo contrario, la adición de de la Aplicación.config a una clase de la biblioteca no hacer nada.

  8. 2

    Su respuesta para no manual de creación de una app.config es el Proyecto de Visual Studio Propiedades/pestaña Configuración.

    Cuando se agrega una configuración y guardar su aplicación.config será creado automáticamente.
    En este punto, un montón de código se genera en un {yourclasslibrary.Propiedades} espacio de nombres que contiene propiedades que corresponden a la configuración. Los valores por sí mismos serán colocados en la aplicación.configuración applicationSettings configuración.

     <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 ha añadido un ámbito de la Aplicación de configuración llamado Setting1 = 3, a continuación, una propiedad llamada Setting1 será creado.
    Estas propiedades se están convirtiendo en parte de la compilación de los binarios y están decoradas con un DefaultSettingValueAttribute que se establece en el valor especificado en tiempo de desarrollo.

         [ApplicationScopedSetting]
        [DebuggerNonUserCode]
        [DefaultSettingValue("3")]
        public string Setting1
        {
            get
            {
                return (string)this["Setting1"];
            }
        }

    Así como en la biblioteca de clase de código que haga uso de estas propiedades si la configuración correspondiente no existe en el archivo de configuración en tiempo de ejecución, que se reserva para utilizar el valor predeterminado. De esa manera la aplicación no se cuelgue para que carecen de un valor de entrada, que es muy confuso la primera vez cuando usted no sabe cómo funcionan las cosas.
    Ahora, usted se está preguntando cómo puede especificar nuestro propio nuevo valor en un desplegado de la biblioteca y evitar que el valor de configuración predeterminado se utiliza?

    Que va a pasar cuando nos configurar correctamente el archivo ejecutable de la aplicación.config. Dos pasos. 1. lo hacemos conscientes de que vamos a tener una sección de ajustes para que la biblioteca de clases y 2. con pequeñas modificaciones se nos pegue la biblioteca de clases del archivo de configuración en el archivo ejecutable de configuración. (hay un método en el que usted puede mantener a la clase de la biblioteca archivo de configuración externo y usted acaba de hacer referencia desde el ejecutable del config.

    Así, usted puede tener una aplicación.config para una biblioteca de clases, pero es inútil si no se integran adecuadamente con la aplicación principal.
    Vea aquí lo que escribí hace algún tiempo: enlace

  9. 1

    No hay ninguna adición automática de la aplicación.archivo de configuración cuando se agrega un proyecto de biblioteca de clases para su solución.

    A mi conocimiento, no hay ningún contador indicación acerca de hacerlo manualmente. Creo que esta es una de uso común.

    Acerca de log4Net de configuración, usted no tiene que poner la config en la app.de configuración, usted puede tener un dedicado conf archivo en el proyecto así como una app.archivo de configuración al mismo tiempo.

    este enlace http://logging.apache.org/log4net/release/manual/configuration.html daré ejemplos acerca de las dos maneras (en la sección de la aplicación.config autónomos y de log4net conf archivo)

    • No me duele nada para agregar un app.config a un proyecto de biblioteca, no. Pero tampoco va a ser utilizado.
    • Que va a ser utilizado en un proyecto de prueba. Consulte stackoverflow.com/a/31389495
  10. 0

    Yo recomendaría el uso de Propiedades.Configuración para almacenar valores como ConnectionStrings y así sucesivamente dentro de la biblioteca de clase. Este es el lugar donde todas las cadenas de conexión se almacena en por sugerencia de visual studio cuando intenta agregar un adaptador de la tabla por ejemplo.
    introduzca la descripción de la imagen aquí

    Y, a continuación, que será accesible mediante el uso de este código, en todos los lugares en los clas biblioteca

    var cs=  Properties.Settings.Default.[<name of defined setting>];

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea