web-dev-qa-db-fra.com

Déplacement du fichier app.config vers un chemin personnalisé

Est-il possible de déplacer l'ensemble du fichier App.Config vers un chemin personnalisé?

Il semble un peu étrange que le fichier de configuration réside dans le même dossier que le fichier exe, avec le nouvel approcah de Windows consistant à enregistrer tous les paramètres du programme dans c:\ProgramData et tous.

Une exigence supplémentaire que nous avons est de spécifier par programme où trouver le fichier app.config. La raison en est que nous générons différentes instances de service à partir des mêmes exes et souhaitons stocker le fichier app.config de chaque service dans le dossier des paramètres de ce service sous c:\ProgramData \\.

23
Ries

Chaque AppDomain a/peut avoir son propre fichier de configuration. Le domaine d'application par défaut créé par l'hôte CLR utilise nom_programme.exe.config; Si vous souhaitez fournir votre propre fichier de configuration, créez un AppDomain séparé. Exemple:

// get the name of the Assembly
string exeAssembly = Assembly.GetEntryAssembly().FullName;

// setup - there you put the path to the config file
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = System.Environment.CurrentDirectory;
setup.ConfigurationFile = "<path to your config file>";

// create the app domain
AppDomain appDomain = AppDomain.CreateDomain("My AppDomain", null, setup);

// create proxy used to call the startup method 
YourStartupClass proxy = (YourStartupClass)appDomain.CreateInstanceAndUnwrap(
       exeAssembly, typeof(YourStartupClass).FullName);

// call the startup method - something like alternative main()
proxy.StartupMethod();

// in the end, unload the domain
AppDomain.Unload(appDomain);

J'espère que cela pourra aider.

15
mYsZa

Si toujours pertinent, nous avons utilisé les éléments suivants que j'ai trouvés sur une autre réponse suggérée à une autre question ici sur Stack Overflow ...

AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", "path to config file")

Cela a très bien fonctionné pour nous lorsque nous avons eu des problèmes lors du chargement de app.config à partir de DLL uniquement ...

36
newby

Cela a fonctionné pour moi. (Extrait de http://msdn.Microsoft.com/en-us/library/system.configuration.appsettingssection.aspx )

// open config
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

// update appconfig file path
config.AppSettings.File = "C:\\dev\\App.config";

// Save the configuration file.
config.Save(ConfigurationSaveMode.Modified);

// Force a reload in memory of the changed section.
ConfigurationManager.RefreshSection("appSettings");

Puis quand tu appelles

NameValueCollection settings = System.Configuration.ConfigurationManager.AppSettings;

ou toute opération pour récupérer la configuration de l'application, le nouveau chemin est utilisé.

J'espère que cela pourrait aider quelqu'un d'autre qui a le même problème!

5
namford

Je sais que c’est une vieille question, mais pour ceux qui veulent simplement avoir leur app.config dans un emplacement différent de celui de leur sortie de sortie binaire, les travaux suivants ont été conçus par Microsoft (et n’ont donc pas besoin d’être relus) et ré-écrire le fichier sur le disque)

  • Définissez un app.config comme vous le faites toujours.
  • Définir un autre fichier de configuration où vous voulez avoir le fichier de configuration réel
  • Modifiez le fichier app.config afin qu'il fasse référence au fichier de configuration.

Au moment de l'exécution, les paramètres du fichier de configuration remplacent les paramètres du fichier app.config (le cas échéant). Et vous avez terminé.

Exemple app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
  <appSettings file="..\Config\settings.config">
    <add key="port" value="1001"/>
  </appSettings>
</configuration>

Notez le file = "..\Config\settings.config". Vous êtes entièrement libre de définir le chemin d'accès à l'emplacement où vous souhaitez que vos utilisateurs modifient les paramètres.

Exemple du fichier de configuration actuel

<?xml version="1.0" encoding="utf-8"?>
<appSettings>
  <add key="port" value="1234"/>
</appSettings>

Au moment de l'exécution, le paramètre port aura la valeur 1234.

Plus d'infos voir msdn

3
bas

C’est une question ancienne, mais j’ai rencontré le même problème et j’ai trouvé un moyen de contourner le problème avec quelques réflexions:

static public class ConfigHack {
    static public void OverrideAppConfig(string path) {
        ((AppDomainSetup)
            typeof(AppDomain)
                .GetField("_FusionStore", BindingFlags.NonPublic | BindingFlags.Instance)
                .GetValue(AppDomain.CurrentDomain))
        .ConfigurationFile = path;
    }

    static public void ResetConfigManager() {
        typeof(ConfigurationManager)
            .GetField("s_initState", BindingFlags.Static | BindingFlags.NonPublic)
            .SetValue(null, 0);
    }
}

Je ne l'ai utilisé que sur .NET2, mais il a la même apparence dans 4 dans le réflecteur. Bien sûr, je ne recommanderais pas l'envoi de ceci: P Je ne l'utilise que pour des tâches internes rapides.

2
wrmsr

Je suis désolé si je comprends mal votre demande mais ne pouvez-vous pas utiliser

MéthodeManagement.OpenExeConfiguration (String)

Sur la base du changement, est-il possible que vous puissiez utiliser

Propriété AppDomainSetup.ConfigurationFile

1
Adriaan Stander

Vous pouvez utiliser la méthode utilisée par astander pour appeler OpenExeConfiguration. Si vous voulez littéralement déplacer votre fichier de configuration, vous devez créer votre propre domaine d'application. Lors de la configuration de votre domaine d'application, vous avez la possibilité de spécifier l'emplacement du fichier de configuration.

BTW, les fichiers de configuration .NET ne sont pas parfaits pour la configuration, du moins pas du genre que les utilisateurs peuvent modifier: ils ne ressemblent pas aux fichiers INI ou au registre. Si vous voulez de la flexibilité quant à l'origine de votre configuration, stockez-la séparément.

0
Tim Robinson