Não é trivial criar um arquivo de configuração do .NET para uma DLL e por um bom motivo. O mecanismo de configuração do .NET possui muitos recursos incorporados para facilitar a atualização / atualização fácil do aplicativo e para proteger os aplicativos instalados contra os arquivos de configuração.
Há uma grande diferença entre como uma DLL é usada e como um aplicativo é usado. É improvável que você tenha várias cópias de um aplicativo instaladas na mesma máquina para o mesmo usuário. Mas você pode muito bem ter 100 aplicativos ou bibliotecas diferentes, todos usando alguma DLL do .NET.
Embora raramente seja necessário rastrear configurações separadamente para cópias diferentes de um aplicativo em um perfil de usuário, é muito improvável que você deseje que todos os diferentes usos de uma DLL compartilhem a configuração entre si. Por esse motivo, quando você recupera um objeto de Configuração usando o método "normal", o objeto retornado é vinculado à configuração do Domínio do Aplicativo em que você está executando, em vez do assembly específico.
O domínio do aplicativo está vinculado ao assembly raiz que carregou o assembly no qual seu código está realmente. Na maioria dos casos, esse é o assembly do seu principal .exe, que foi o que carregou o .dll. É possível ativar outros domínios de aplicativo em um aplicativo, mas você deve fornecer explicitamente informações sobre qual é o conjunto raiz desse domínio de aplicativo.
Por tudo isso, o procedimento para criar um arquivo de configuração específico da biblioteca não é tão conveniente. É o mesmo processo que você usaria para criar um arquivo de configuração portátil arbitrário não vinculado a nenhum assembly específico, mas para o qual você deseja usar o esquema XML do .NET, a seção de configuração e os mecanismos do elemento de configuração, etc. Isso implica a criação de um ExeConfigurationFileMap
objeto , carregando os dados para identificar onde o arquivo de configuração será armazenado e depois chamando ConfigurationManager
. OpenMappedExeConfiguration
para abri-lo em uma nova Configuration
instância. Isso impedirá a proteção da versão oferecida pelo mecanismo de geração automática de caminho.
Estatisticamente falando, você provavelmente está usando esta biblioteca em uma configuração interna e é improvável que você tenha vários aplicativos usando-a em qualquer máquina / usuário. Mas se não, há algo que você deve ter em mente. Se você usar um único arquivo de configuração global para sua DLL, independentemente do aplicativo que está fazendo referência a ele, precisará se preocupar com conflitos de acesso. Se dois aplicativos que fazem referência à sua biblioteca estiverem em execução ao mesmo tempo, cada um com seu próprio Configuration
objeto aberto, quando um salvar alterações, causará uma exceção na próxima vez que você tentar recuperar ou salvar dados no outro aplicativo.
A maneira mais simples e segura de contornar isso é exigir que o assembly que está carregando sua DLL também forneça algumas informações sobre si mesmo ou para detectá-lo examinando o domínio de aplicativo do assembly de referência. Use isso para criar algum tipo de estrutura de pastas para manter arquivos de configuração do usuário separados para cada aplicativo que faz referência à sua DLL.
Se você tiver certeza de que deseja ter configurações globais para sua DLL, independentemente de onde ela é referenciada, será necessário determinar sua localização, em vez de o .NET descobrir automaticamente uma apropriada. Você também precisará ser agressivo ao gerenciar o acesso ao arquivo. Você precisará armazenar em cache o máximo possível, mantendo a Configuration
instância apenas o tempo necessário para carregar ou salvar, abrindo imediatamente antes e descartando imediatamente depois. E, finalmente, você precisará de um mecanismo de bloqueio para proteger o arquivo enquanto ele está sendo editado por um dos aplicativos que usam a biblioteca.