Pergunta

Eu estou brincando com suporte de configuração do .NET (a classe ConfigurationManager e aulas de apoio relacionados). Eu gostaria de escrever um aplicativo que, uma vez instalado:

  • Tem configurações padrão no foo.exe.config (em Arquivos de Programas).
  • O usuário pode depois substituir as configurações com valores não padrão, que deve ser mantida.
  • preferências do usuário deve ser mantida no perfil do usuário, desde que ele não deve ter permissões de gravação para o diretório Arquivos de Programas.

O aplicativo deve usar as preferências do usuário quando está pronto, caso contrário, utilizar os padrões.

Parece que este deve ser fácil - é um padrão muito comum. Mas minhas tentativas de este estiver executando em colisões e eu estou querendo saber se eu estou tomando a abordagem correta.

O seguinte código produz a excepção de tempo de execução "propriedades ConfigurationSection não pode ser editada quando bloqueado".

using System;
using System.Configuration;

namespace DemoAppSettingsProblem
{
    class Program
    {
        static void Main(string[] args)
        {
            Configuration userConfig =
                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            if ( userConfig.AppSettings.Settings["foo"] != null )
                userConfig.AppSettings.Settings.Remove("foo");

            userConfig.AppSettings.Settings.Add("foo", "The string is foo.");

            userConfig.Save(ConfigurationSaveMode.Modified);    // exception!
        }
    }
}

O problema é que a seção <appSettings> definido pelo .NET é declarada com o allowExeDefinition=MachineToApplication padrão (ver este belo post por Irena Kennedy da Microsoft). Esta proíbe a secção de ser escrito para o perfil do usuário (local ou em roaming).

Assim, presumo eu preciso definir minha própria seção, com allowExeDefinition=MachineToLocalUser. Mas, tanto quanto eu posso dizer da documentação do MSDN, isso significa que eu preciso para criar minha própria classe de configuração, derivado de ConfigurationSection. Os exemplos não me aponte na direção mais trabalho do que eu estava esperando, que geralmente define fora meus sinos de alarme que eu estou fazendo algo errado.

É realmente tão difícil de conseguir isso? Existe uma maneira simples .NET fornece para apoiar isso, ou eu deveria talvez ser tomar uma abordagem completamente diferente?

Foi útil?

Solução

Eu usei o recurso de configurações, ele grava as configurações de usuário para a configuração do aplicativo para você ...

http://msdn.microsoft.com/ en-us / library / aa730869 (VS.80) .aspx

Outras dicas

Assumindo que você está no .NET 2.0 e superior, você tem verificado os arquivos "Configurações"? Aqueles estão sendo armazenados dentro do seu app.config -. Configurações do aplicativo em seções <applicationSettings>, configurações definíveis pelo usuário em , que, aliás, tem a configuração que você mencionou allowExeDefinition=MachineToLocalUser

Talvez isso poderia ser uma abordagem? Essas configurações de usuário são um tipo definido, o que você poderia definitivamente reutilização sob um nome diferente, se necessário ( "MySettings").

Marc

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top