20

Tengo un exe con un archivo App.Config. Ahora quiero crear un contenedor dll alrededor del exe para consumir algunas de las funcionalidades.Obtenga la App.Config de otro Exe

La pregunta es ¿cómo puedo acceder a la propiedad app.config en el archivo exe del wrapper dll?

Tal vez debería ser un poco más en mis preguntas, tengo el siguiente contenido app.config con el exe:

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

La cuestión es cómo cómo llegar "myValue" fuera de la envoltura dll?


gracias por su solución.

En realidad, mi concepto inicial era evitar el método de lectura de archivos XML o LINQ o lo que sea. Mi solución preferida fue usar el configuration manager libraries and the like.

Agradeceré cualquier ayuda que use las clases que normalmente están asociadas con el acceso a las propiedades de app.config.

Respuesta

4

Después de algunas pruebas, he encontrado una manera de hacer esto.

  1. Agregue el archivo App.Config al proyecto de prueba. Use la opción "Agregar como enlace".
  2. Usa System.Configuration.ConfigurationManager.AppSettings["myKey"] para acceder al valor.
+0

+1 Habría publicado esta respuesta si aún no lo hubiera hecho. Esta es también una buena solución para algunos otros escenarios con respecto a los archivos de configuración distribuidos en diferentes proyectos dentro de una solución. – takrl

0

Es un archivo xml, puede utilizar enfoques basados ​​en Linq-XML o DOM para analizar la información relevante.
(esto dicho me pregunta si no hay un mejor diseño para lo que sea .. que está tratando de lograr.)

21

El ConfigurationManager.OpenMappedExeConfiguration Method le permitirá hacer esto.

de ejemplo de la página de MSDN:

static void GetMappedExeConfigurationSections() 
{ 
    // Get the machine.config file. 
    ExeConfigurationFileMap fileMap = 
     new ExeConfigurationFileMap(); 
    // You may want to map to your own exe.comfig file here. 
    fileMap.ExeConfigFilename = 
     @"C:\test\ConfigurationManager.exe.config"; 
    System.Configuration.Configuration config = 
     ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
     ConfigurationUserLevel.None); 

    // Loop to get the sections. Display basic information. 
    Console.WriteLine("Name, Allow Definition"); 
    int i = 0; 
    foreach (ConfigurationSection section in config.Sections) 
    { 
     Console.WriteLine(
      section.SectionInformation.Name + "\t" + 
     section.SectionInformation.AllowExeDefinition); 
     i += 1; 

    } 
    Console.WriteLine("[Total number of sections: {0}]", i); 

    // Display machine.config path. 
    Console.WriteLine("[File path: {0}]", config.FilePath); 
} 

EDIT: Esta debe ser la salida el valor "myKey":

ExeConfigurationFileMap fileMap = 
    new ExeConfigurationFileMap(); 
fileMap.ExeConfigFilename = 
    @"C:\test\ConfigurationManager.exe.config"; 
System.Configuration.Configuration config = 
    ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
    ConfigurationUserLevel.None); 
Console.WriteLine(config.AppSettings.Settings["MyKey"].Value); 
+0

Hola Espo, su sugerencia fue genial. Pero tal vez lo que estaba buscando era un poco diferente. He editado mi pregunta para que sea más explícita. – Graviton

+0

Ahora he agregado una muestra de cómo puede generar su clave/valor requerido. – Espo

0

que había segundo punto de Gishu que hay otra manera. ¿No sería mejor eliminar la parte común/"pública" del EXE en DLL para crear un contenedor EXE para ejecutarlo? Este es sin duda el patrón de desarrollo más habitual. Solo las cosas que desea consumir irían a la DLL, y el EXE haría todas las cosas que hace actualmente, menos lo que se ha ido en la DLL.

+0

Hola alastairs, me doy cuenta de que tienes un punto aquí. Pero estoy creando la envoltura dll como un ensamblaje de prueba para probar la lógica dentro de mi exe. Por lo tanto, no tengo otra opción :) – Graviton

2

creo que lo que estás buscando es:

System.Configuration.ConfigurationManager.OpenExeConfiguration(string path) 
-1

Añadir un enlace en el IDE solo ayudaría durante el desarrollo. Creo que lomaxx tiene la idea correcta: System.Configuration.ConfigurationManager.OpenExeConfiguration.

+0

Lo intenté, pero no pareció funcionar. – Graviton

Cuestiones relacionadas