El complemento ArcMap con app.settings no reconoce los cambios de app.config?


14

He desarrollado un complemento ArcMap que requiere un archivo de configuración. Después de pasar un tiempo tratando de leer los valores de configuración de un único archivo App.Config (y siempre quedando nulo), creo que el complemento no puede leer valores desde aquí, ya que es una biblioteca de clases y busca la aplicación de llamada (ArcMap) El archivo de configuración cuando solicito el valor de una clave (de ahí el valor nulo).

Para solucionar esto, utilicé un archivo App.Settings, que la aplicación puede leer bien. La creación de esto también introduce un archivo App.Config en el entorno y Visual Studio parece mantener los dos archivos sincronizados durante el desarrollo.

Ahora que se está implementando el complemento, necesito poder cambiar los valores de configuración (por ejemplo, la ubicación del archivo de registro). Intenté abrir / extraer el archivo .esriaddin y actualizar el archivo App.Config allí, pero el complemento conserva los mismos valores de configuración que tenía cuando se compiló. Sé que los nuevos valores de App.Config se mantienen en el archivo .esriaddin porque puedo verlos nuevamente después de cerrar el archivo.

¿Alguien sabe una forma confiable de configurar un complemento y permitir que esta configuración se pueda actualizar una vez implementada? Cualquier sugerencia es muy bienvenida, ya que parece ridículo que necesite un archivo de configuración personalizado para esto.

Los valores de App.Settings están en el nivel de la aplicación, y actualmente App.Settings y App.Config tienen una acción de compilación: ninguna / no copiar.

Respuestas:


8

Descubrí cómo configurar el complemento.

El archivo de complemento en ... Documentos \ ArcGIS \ AddIns \ Desktop10.0 ... se expande cada vez que se carga ArcMap, por lo que el único lugar donde CUALQUIER archivo de configuración incrustado en el complemento puede editarse aquí. No experimenté con el uso de claves de registro o con un directorio de configuración de complementos dedicado, ya que esto parecía excesivo.

Al final, utilicé un archivo app.config (porque incluso si se usa con una biblioteca de clases, que ignora el archivo de configuración, todavía se renombra en línea con el ensamblado y se incluye automáticamente en el archivo de complementos) para mi configuración. Basado en un enlace proporcionado anteriormente, utilicé la siguiente clase de configuración

...

    public AppConfig()
    {
        try
        {
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = this.GetType().Assembly.Location + ".config";
            config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        }
        catch (Exception)
        {
            ...
        }
    }

    private string getValue(string key) 
    {
        return config.AppSettings.Settings[key].Value;
    }

...

Para editar la configuración una vez que se implementa el complemento, tuve que cerrar ArcMap, abrir el archivo .esriAddIn con winrar, ir a \ install y abrir el archivo de configuración, editarlo, cerrar el editor y luego permitir que winrar actualice el archivo dentro del archivo. archivo. Luego, al volver a cargar ArcMap, el cambio entra. Es una de las primeras cosas que intenté, pero creo que tuve problemas porque el editor del archivo de configuración todavía estaba abierto cuando winrar actualizó el archivo.


¿Te has encontrado algún error últimamente con OpenMappedExeConfiguration? Estaba usando un enfoque similar que funcionó bien hasta que, hace solo un par de días, dejó de funcionar, tal vez después de instalar algunas actualizaciones de Windows. Vea esta pregunta mía de StackOverflow .
blah238

@ blah238 No he probado este complemento por un tiempo y no tengo la oportunidad en este momento. Sin embargo, si puede resumir sus actualizaciones recientes de Windows / .NET, puedo ver si las mías (Win7) coinciden y se lo
hago

La única que vi que parecía relevante fue una actualización de seguridad de .NET 4 . No estoy seguro de si eso también podría afectar a .NET 3.5, que es a lo que me dirijo.
blah238

Para su información, terminé reescribiendo la lógica de configuración de mi complemento para usar la serialización (de) XML tradicional en lugar del sistema de configuración .NET, cuyo principal atractivo fue que el archivo .config se extrae automáticamente junto con el ensamblaje del archivo .esriAddin, algo que no puedo, por lo que puedo decir, hacer con un archivo XML arbitrario, pero para mis propósitos decidí que realmente no necesitaba proporcionar una configuración predeterminada, solo persistir configuraciones específicas del usuario). Sin embargo, me gustaría saber si esto también está afectando a otros desarrolladores de complementos.
blah238

Hurgando un poco más con el enfoque .config y Fusion revela que ESRI está usando Assembly.LoadFrom () para cargar ensamblados de complementos. Por lo que he leído, esto va en contra de la mejor práctica que es configurar un AppDomain separado para complementos, y puede explicar por qué ConfigurationManager no se molesta en buscar el ensamblaje en la ubicación correcta. Lo que no entiendo es por qué incluso necesita buscar el ensamblaje nuevamente cuando ya se ha cargado en el AppDomain predeterminado. Solo puedo suponer que una actualización de seguridad de .NET comenzó a exigir que las ubicaciones de ensamblaje se verifiquen con más frecuencia.
blah238

6

Tomando prestado de una respuesta similar , puede usar esto en su complemento:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");

Gracias por el consejo, la ruta creada por lo anterior no es válida ya que da ... / addInName.dll / config.xml, pero me llevó por el camino correcto. Ahora estoy usando el un poco más simplethis.GetType().Assembly.Location + ".config"
tomfumb

2

El archivo de configuración estándar de .NET es por aplicación, no por biblioteca. Esto significa que cuando su complemento se ejecuta dentro del proceso ArcMap, sus ajustes de configuración deben especificarse en ArcMap.exe.config, que debe colocarse además de ArcMap.exe.

Por supuesto, esto no siempre es posible en el entorno de producción y también viola el aislamiento de los complementos, que es una de las razones por las que los complementos se introdujeron en primer lugar.

Deberá almacenar su configuración de manera diferente, ya sea en su propio archivo de configuración (como se indica en la respuesta de Kirk) o en el registro del sistema.

Puede monitorear los cambios en su archivo de configuración de varias maneras, por ejemplo, aprovechando la clase FileSystemWatcher .


1

La respuesta de Kirk Kuykendall no funcionó para mí, ya que seguía apuntando al .dll mismo. Usé lo siguiente para señalar el archivo de configuración

System.IO.StreamReader file = new System.IO.StreamReader(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location) + "\\config.cfg");

0

Si bien no he mirado el nuevo modelo para el Complemento ESRI, lo que he hecho y visto hecho por otros es el usuario de UserHive en el registro. Luego puede tener una pantalla en su complemento para actualizar la cantidad de valores que necesita.

El uso de un archivo App.config tiende a requerir que reinicie la aplicación / extensión totalmente para leer nuevos valores; mientras que es más fácil hacer actualizaciones sobre la marcha desde el registro.


0

Podría intentar modificar la copia del archivo de configuración ubicado en la caché de ensamblado de complementos . Creo que el esriaddin solo se expande una vez por ArcGIS. Por lo tanto, no se pueden usar modificaciones posteriores (aunque debería notar que el archivo esriaddin es más nuevo que su caché).

Vista / 7: C: \ Users \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssemblyCache

XP: C: \ Documents and Settings \\ Configuración local \ Datos de aplicación \ ESRI \ Desktop10.0 \ AssemblyCache


Sugerencia interesante, pero desafortunadamente esto no marcó la diferencia. El archivo de configuración en el directorio AssemblyCache se sobrescribe cuando se inicia ArcMap: cambié el archivo de configuración aquí y en el complemento en ... \ Documents \ ArcGIS \ AddIns \ Desktop10. ¡0, así que no tengo idea de dónde proviene el valor para la sobrescritura!
tomfumb

Apreciamos la entrada, pero parece que el archivo .esriAddIn en Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... realmente se extrae cada vez que se carga la aplicación, por lo que se pierden todos los cambios en la caché de ensamblaje del complemento.
tomfumb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.