Suplemento do ArcMap com app.settings que não reconhece as alterações do app.config?

14

Eu desenvolvi um complemento do ArcMap que requer um arquivo de configuração. Depois de passar um tempo tentando ler os valores de configuração de um único arquivo App.Config (e sempre ficando nulo), acredito que o Suplemento não pode ler valores daqui, pois é uma biblioteca de classes, e procura o aplicativo de chamada (ArcMap) é o arquivo de configuração quando solicito o valor de uma chave (daí o nulo).

Para contornar isso, usei um arquivo App.Settings, que o aplicativo pode ler bem. Criar isso também introduz um arquivo App.Config no ambiente e o Visual Studio parece manter os dois arquivos sincronizados durante o desenvolvimento.

Agora que o suplemento está sendo implantado, preciso alterar os valores de configuração (por exemplo, local do arquivo de log). Tentei abrir / extrair o arquivo .esriaddin e atualizar o arquivo App.Config lá, mas o suplemento mantém os mesmos valores de configuração que tinha quando compilado. Eu sei que os novos valores App.Config estão sendo mantidos no arquivo .esriaddin porque eu posso visualizá-los novamente após fechar o arquivo morto.

Alguém conhece uma maneira confiável de configurar um suplemento e permite que essa configuração seja atualizável após a implantação? Qualquer sugestão muito bem-vinda, pois parece ridículo que eu precise de um arquivo de configuração personalizado para isso.

Os valores de App.Settings estão no nível do aplicativo e, atualmente, App.Settings e App.Config têm ação de compilação: nenhum / não copia.

tomfumb
fonte

Respostas:

8

Eu descobri como configurar o addin.

O arquivo addin em ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... é expandido toda vez que o ArcMap é carregado, portanto, o único local em que QUALQUER arquivo de configuração incorporado no addin pode ser editado é aqui. Não experimentei usar chaves de registro ou usar um diretório de configuração de suplementos dedicado, pois isso parecia um exagero.

No final, usei um arquivo app.config (porque mesmo se usado com uma biblioteca de classes, que ignora o arquivo de configuração, ele ainda é renomeado de acordo com o assembly e incluído automaticamente no arquivo de complemento) para minhas configurações. Com base em um link fornecido acima, usei a seguinte classe de configuração

...

    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 a configuração após a implantação do suplemento, tive que fechar o ArcMap, abrir o arquivo .esriAddIn com o winrar, vá para \ install e abra o arquivo de configuração, edite-o, feche o editor e permita que o winrar atualize o arquivo no diretório arquivo. Recarregando o ArcMap, a mudança ocorre. Irritantemente, essa é uma das primeiras coisas que tentei, mas acho que tive problemas porque o editor do arquivo de configuração ainda estava aberto quando o winrar atualizou o arquivo.

tomfumb
fonte
Você encontrou algum erro recentemente com o OpenMappedExeConfiguration? Eu estava usando uma abordagem semelhante que funcionou bem até, alguns dias atrás, parar de funcionar, talvez após a instalação de algumas atualizações do Windows. Veja esta minha pergunta sobre StackOverflow .
blah238
@ blah238 Não testei este suplemento por um tempo e não tenho a oportunidade agora. No entanto, se você pode resumir suas atualizações recentes do Windows / .NET, posso ver se o meu (Win7) corresponde e informar você
tomfumb
O único que vi que parecia relevante foi uma atualização de segurança do .NET 4 . Não tenho certeza se isso também pode afetar o .NET 3.5, que é o meu objetivo.
blah238
Para sua informação, acabei reescrevendo a lógica de configuração do meu suplemento para usar a (des) serialização tradicional de XML em vez do sistema de configuração .NET, cuja principal atração percebi foi que o arquivo .config é extraído automaticamente junto com o assembly do arquivo .esriAddin - algo que você não pode, até onde eu sei, fazer com um arquivo XML arbitrário - mas, para meus propósitos, decidi que realmente não precisava fornecer uma configuração padrão, apenas persistia configurações específicas do usuário). Eu ainda gostaria de saber se isso também está afetando outros desenvolvedores de suplementos.
precisa saber é o seguinte
Indo um pouco mais com a abordagem .config e o Fusion revela que o ESRI está usando Assembly.LoadFrom () para carregar os assemblies de suplemento. Pelo que li, isso vai contra a melhor prática que é configurar um AppDomain separado para suplementos e pode explicar por que o ConfigurationManager não se incomoda em procurar o assembly no local correto. O que eu não entendo é por que ele precisa procurar a montagem novamente quando ela já foi carregada no AppDomain padrão. Só posso supor que uma atualização de segurança do .NET começou a impor que os locais de montagem sejam verificados com mais frequência.
blah238
6

Tomando emprestado de uma resposta semelhante , você pode usar isso em seu suplemento:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");
Kirk Kuykendall
fonte
Obrigado pela dica, o caminho criado pelos itens acima não é válido, pois fornece ... / addInName.dll / config.xml, mas ele me colocou no caminho certo. Agora estou usando o um pouco mais simplesthis.GetType().Assembly.Location + ".config"
tomfumb
2

O arquivo de configuração padrão do .NET é por aplicativo, não por biblioteca. Isso significa que, quando seu suplemento é executado no processo do ArcMap, suas definições de configuração precisam ser especificadas no ArcMap.exe.config, que precisa ser colocado além do ArcMap.exe.

Obviamente, isso nem sempre é possível no ambiente de produção e também viola o isolamento de suplementos, que é um dos motivos pelos quais os suplementos foram introduzidos.

Você precisará armazenar suas configurações de maneira diferente, em seu próprio arquivo de configuração (como sugerido na resposta de Kirk) ou no registro do sistema.

Você pode monitorar as alterações no seu arquivo de configuração de várias maneiras, por exemplo, aproveitando a classe FileSystemWatcher .

Petr Krebs
fonte
1

A resposta de Kirk Kuykendall não funcionou para mim, pois continuava apontando para a própria DLL. Eu usei o seguinte para apontar para o arquivo de configuração

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

Embora eu não tenha olhado para o novo modelo do Add-in da ESRI, o que eu fiz e vi feito por outras pessoas é o usuário do UserHive no registro. Você pode ter uma tela em seu suplemento para atualizar a possibilidade dos valores necessários.

O uso de um arquivo App.config tende a exigir que você reinicie totalmente o aplicativo / extensão para ler novos valores; embora seja mais fácil fazer atualizações dinâmicas a partir do registro.

DEWright
fonte
0

Você pode tentar modificar a cópia do arquivo de configuração localizado no cache do Conjunto de Suplementos . Acredito que o esriaddin só seja expandido uma vez pelo ArcGIS. Portanto, modificações subsequentes não podem ser usadas (embora você deva notar que o arquivo esriaddin é mais recente que seu cache).

Vista / 7: C: \ Usuários \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssemblyCache

XP: C: \ Documents and Settings \\ Configurações locais \ Dados do aplicativo \ ESRI \ Desktop10.0 \ AssemblyCache

James Schek
fonte
Sugestão interessante, mas infelizmente isso não fez diferença. O arquivo de configuração no diretório AssemblyCache é substituído quando o ArcMap é iniciado - alterei o arquivo de configuração aqui e no AddIn em ... \ Documents \ ArcGIS \ AddIns \ Desktop10. 0, por isso não faço ideia de onde vem o valor da substituição!
precisa saber é o seguinte
Aprecie a entrada, mas parece que o arquivo .esriAddIn em Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... na verdade é extraído toda vez que o aplicativo é carregado, para que todas as alterações no cache do assembly sejam perdidas.
precisa saber é o seguinte