Pregunta

Tenemos un "motor" que carga dinámicamente archivos DLL (lo que esté ubicado en un directorio determinado) y llama a clases de flujo de trabajo desde ellos a modo de reflexión.

Ahora tenemos algunos flujos de trabajo nuevos que requieren acceso a una base de datos, así que pensé en colocar un archivo de configuración en el directorio dll.

Pero por alguna razón mis flujos de trabajo simplemente no ven el archivo de configuración.

<configuration>
  <appSettings>
      <add key="ConnectString" value="Data Source=officeserver;Database=mydatabase;User ID=officeuser;Password=officeuser;" />
  </appSettings>
</configuration>

Dado el archivo de configuración anterior, el siguiente código imprime una cadena vacía:

Console.WriteLine(ConfigurationManager.AppSettings["ConnectString"]);

Creo que lo que quiero es simplemente especificar un nombre de archivo de configuración, pero tengo problemas aquí.Simplemente no obtengo resultados.¿Alguien tiene algún consejo?

¿Fue útil?

Solución

Si su ejemplo de código para leer AppSettings está en su DLL, intentará leer el archivo de configuración de la aplicación y no el archivo de configuración de la DLL. Esto se debe a que está utilizando Reflection para ejecutar el código.

Otros consejos

Divertido, donde estoy estamos haciendo algo muy similar y el archivo de configuración se carga muy bien. En nuestro caso, creo que el nombre de cada nuevo archivo de configuración coincide con el de su ensamblaje asociado. Por lo tanto, MyLibrary.dll tendría un archivo llamado MyLibrary.dll.config con información para ese ensamblado de archivos. Además, el ejemplo que tengo a mano es usar VB.Net en lugar de C # (tenemos algunos de cada uno) y todas las configuraciones allí son para el espacio de nombres My.Settings específico de VB, por lo que no usamos la clase ConfigurationManager directamente para léelos.

La configuración en sí se ve así:

<applicationSettings>
    <MyLibrary.My.MySettings>
        <setting name="SomeSetting" serializeAs="String">
            <value>12345</value>
        </setting>
    </MyLibrary.My.MySettings>
</applicationSettings>

Escribí esto para un sistema similar.Mi recuerdo es que usé Assembly.GetExecutingAssembly para obtener la ruta del archivo a la DLL, adjunta .config a ese nombre, lo cargué como un XmlDocument, navegó hasta el <appSettings> nodo y lo pasó a un NameValueSectionHandler's Create método.

Aquí hay una forma: AppDomain.CurrentDomain.SetData (& Quot; APP_CONFIG_FILE & Quot ;, & Quot; ruta al archivo de configuración & Quot;);

Llame al constructor.

Si no recuerdo mal, la aplicación.config se cargará desde el directorio de su aplicación, por lo que si está cargando archivos DLL desde otro directorio, querrá las claves que necesitan en el archivo de configuración de su aplicación.

No estoy totalmente seguro, pero creo que esa clase solo funciona con la ruta del método de entrada del AppDomain (la ruta del exe la mayor parte del tiempo) de forma predeterminada. Debe llamar a OpenExeConfiguration (string exePath) (Framework 2.0 y posterior) primero para apuntar a un archivo de configuración diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top