Estou tentando adicionar um arquivo app.config à minha DLL, mas todas as tentativas falharam.
De acordo com o MusicGenesis em ' Colocando informações de configuração em uma DLL ', isso não deve ser um problema. Então, obviamente, estou fazendo algo errado ...
O código a seguir deve retornar meu ConnectionString da minha DLL:
return ConfigurationManager.AppSettings["ConnectionString"];
No entanto, quando copio o arquivo app.config para o aplicativo do console, ele funciona bem.
Alguma ideia?
c#
app-config
Megabyte
fonte
fonte
Respostas:
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 chamandoConfigurationManager
.OpenMappedExeConfiguration
para abri-lo em uma novaConfiguration
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.fonte
se você quiser ler as configurações do arquivo de configuração da DLL, mas não dos aplicativos raiz web.config ou app.config, use o código abaixo para ler a configuração na dll.
fonte
Eu tive o mesmo problema e procurei na web por várias horas, mas não consegui encontrar nenhuma solução, então criei a minha. Eu me perguntava por que o sistema de configuração .net é tão inflexível.
Background: Desejo que meu DAL.dll tenha seu próprio arquivo de configuração para o banco de dados e as configurações do DAL. Também preciso do app.config da Enterprise Library e de suas próprias configurações. Então, eu preciso do app.config e dll.config.
O que eu não queria fazer era passar todas as propriedades / configurações do aplicativo para a minha camada DAL!
dobrar o "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" não é possível porque eu preciso dele para o comportamento normal do app.config.
Meus requisitos / pontos de vista foram:
Eu vim modificando o arquivo Settings.cs e implementei um método que abre o ClassLibrary1.dll.config e lê as informações da seção em um campo particular. Depois disso, substituí "this [string propertyName]" para que o Settings.Desginer.cs gerado chame minha nova propriedade em vez da classe base. Lá, a configuração é lida na lista.
Finalmente, há o seguinte código:
Você apenas precisará copiar o ClassLibrary1.dll.config do diretório de saída ClassLibrary1 para o diretório de saída do aplicativo. Talvez alguém ache útil.
fonte
Ao usar o ConfigurationManager, tenho certeza de que está carregando o
AppDomain
arquivo de processo / configuração (app.config / web.config). Se você deseja carregar um arquivo de configuração específico, precisará solicitá-lo especificamente por nome ...Você poderia tentar:
fonte
ConfigurationManager.AppSettings retorna as configurações definidas para o aplicativo, não para a DLL específica, você pode acessá-los, mas são as configurações do aplicativo que serão retornadas.
Se você estiver usando a dll de outro aplicativo, o ConnectionString estará nas app.settings do aplicativo.
fonte
Eu sei que isso é tarde para a festa, no entanto, pensei em compartilhar a solução que uso para DLLs.
Eu sou mais da escola de pensamento do KISS, então, quando eu tenho uma DLL do .NET que deseja armazenar pontos de dados externos que controlam como ela funciona ou para onde vai, etc. Eu simplesmente crio uma classe "config" que possui apenas propriedades públicas que armazenam todos os pontos de dados necessários e que eu gostaria de poder ter um controle externo à DLL para impedir a recompilação para fazer as alterações. Então eu uso o XML Serializing do .Net para salvar e carregar a representação de objeto da classe em um arquivo.
Existem várias maneiras de lidar com a leitura e o acesso a ela, de um Singleton, uma classe de utilitário estático, a métodos de extensão etc. Isso depende de como sua DLL está estruturada e de qual método se ajustará melhor à sua DLL.
fonte
você está correto, você pode ler o arquivo de configuração de uma dll. Eu lutei com isso por um dia até descobrir que o meu arquivo de configuração era o problema. Veja meu código abaixo. foi capaz de correr.
meu
Plugin1.dll.config
olhou como abaixo;Descobri que meu arquivo de configuração não possuía a
<appSettings>
tag. Portanto, olhe em volta, seu problema pode ter sido diferente, mas não tão distante do meu.fonte
Como o assembly reside em um cache temporário, você deve combinar o caminho para obter a configuração da dll:
fonte
Se você estiver usando bibliotecas que pesquisam uma grande quantidade de configuração nos bastidores, como o WCF, considere fazer o seguinte:
Ou no PowerShell:
Na IMO, essa técnica é um cheiro de código e é realmente adequada apenas para uso em scripts ad hoc. Se você deseja fazer isso no código de produção, talvez seja hora de fazer uma revisão da arquitetura.
NÃO é recomendado o seguinte:
Como curiosidade técnica, veja uma variação do tema. Você pode criar um construtor estático dentro de uma das classes armazenadas na DLL e fazer essa chamada a partir daí. Eu não recomendaria fazer isso, exceto como último recurso.
fonte
A solução completa nem sempre é encontrada em um único local ...
1) Crie um arquivo de configuração de aplicativo e denomine "yourDllName.dll.config"
2) Clique com o botão direito do mouse no arquivo de configuração criado acima no VS Solution Explorer, clique em Propriedades
--- set "Build Action" = Content
--- set "Copy To Output Directory" = Sempre
3) Adicione uma seção appSettings ao arquivo de configuração (yourDllName.dll.config) com yourKeyName e yourKeyValue
4) Adicione System.Configuration às suas referências de DLL / classe / projeto.
5) Adicione as instruções using ao seu código onde você pretende acessar a configuração
6) Para acessar o valor
7) alegra-se, funciona
IMHO, isso só deve ser usado no desenvolvimento de uma nova dll / biblioteca.
O arquivo de configuração acaba sendo uma ótima referência, pois quando você adiciona o appSettings da DLL ao seu aplicativo real.
fonte
Parece que esses arquivos de configuração são realmente confusos para esclarecer à medida que seu comportamento muda do ambiente de desenvolvimento para a implantação. Aparentemente, uma DLL pode ter seu próprio arquivo de configuração, mas depois que você copia e cola a dll (junto com o arquivo de configuração) em outro local, tudo parou de funcionar. A única solução é mesclar manualmente os arquivos app.config em um único arquivo, que será usado apenas pelo exec. Por exemplo, myapp.exe terá um arquivo myapp.exe.config que contém todas as configurações de todas as DLLs usadas pelo myapp.exe. Estou usando o VS 2008.
fonte
Encontrei o que parece ser uma boa solução para esse problema. Estou usando o VS 2008 C #. Minha solução envolve o uso de namespaces distintos entre vários arquivos de configuração. Publiquei a solução no meu blog: http://tommiecarter.blogspot.com/2011/02/how-to-access-multiple-config-files-in.html .
Por exemplo:
Este namespace lê / grava configurações de DLL:
Este espaço para nome lê / grava as configurações de exe:
Existem algumas ressalvas mencionadas no artigo. HTH
fonte
Como Marc diz, isso não é possível (embora o Visual Studio permita adicionar um arquivo de configuração de aplicativo em um projeto de biblioteca de classes).
Você pode querer verificar a classe AssemblySettings, que parece tornar possível os arquivos de configuração da montagem.
fonte
Nesta postagem, um problema semelhante foi discutido e resolvido. Como carregar dinamicamente um arquivo separado de Configurações do aplicativo e mesclar com as configurações atuais? pode ser de ajuda
fonte
Para uma dll, ela não deve depender da configuração, pois a configuração pertence ao aplicativo e não à dll.
Isso é explicado aqui
fonte
você pode usar este código:
fonte