Je veux changer l'emplacement où mon application recherche le fichier app.config. p>
Je sais que je peux utiliser ConfigurationManager.OpenExEconfiguration () pour accéder à un fichier de configuration arbitraire - Toutefois, lorsque le fichier .NET se lit sur le fichier de configuration (pour connexionstrings ou événementsources, par exemple), il examinera l'emplacement par défaut. Je veux réellement changer l'emplacement, globalement pour l'ensemble du framework .NET (pour mon application, bien sûr). P>
Je sais aussi que je peux utiliser AppDominsetup pour changer l'emplacement de l'app.config pour une nouvelle Appdomain. Cependant, cela ne s'applique pas à l'appdomain principal de l'application. P>
Je sais aussi que je peux remplacer la fonction principale () et créer une nouvelle appdomaine comme ci-dessus et exécuter ma demande dans cette nouvelle Appdomain. Toutefois, cela a d'autres effets secondaires - par exemple, assemblage.getyRySembly () retournera une référence nulle. P>
Étant donné comment tout le reste travaille à .NET, je m'attendrais à ce qu'il y ait un moyen de configurer l'environnement de démarrage de ma candidature - via un manifeste d'application, ou d'autres, mais j'ai été incapable de trouver même une lueur d'espoir Dans cette direction. P>
Tout pointeur serait utile. P>
David Mullin P>
4 Réponses :
Je ne sais pas pourquoi vous souhaitez modifier l'emplacement de votre fichier de configuration - peut-être y avoir une approche différente pour résoudre votre problème réel. J'avais une exigence où je voulais partager des fichiers de configuration à travers des applications connexes - j'avais choisi d'utiliser votre propre fichier XML car il m'avait donné un avantage supplémentaire d'avoir un contrôle complet sur le schéma. P>
Dans votre cas, il est possible d'externaliser des sections de votre fichier de configuration à un fichier distinct à l'aide de la propriété ConfidSource. Voir ici sous "Utilisation de fichiers de configuration externes" pour vérifier comment il a été fait pour la section Strings de connexion. Peut-être que cela peut vous aider. P>
La principale raison de vouloir faire cela est que l'application est installée via ClickOnce, ce qui masque efficacement le fichier de configuration. Cependant, il existe des paramètres (comme Tracesource entrées) que je souhaite être configurable sur la machine cliente et de persister entre les installations (puisque une mise à jour ClickOnce peut remplacer le fichier de configuration).
Je vois - peut-être que vous pouvez utiliser des appsettings ( msdn.microsoft.com/en-us /Library/k4s6c3a0.aspx ) pour cela? Ils prennent en charge le scénario ClickOnce - voir msdn.microsoft.com/en-us/library/ MS228995.aspx .
Je ne peux pas utiliser les applications, car le .NET Framework ne l'examinera pas pour tracesources (ou toute autre configuration spécifique au cadre).
J'ai utilisé l'approche avec le démarrage d'une autre Appdomain à partir de Main (), spécifiant le "nouveau" emplacement du fichier de configuration.
Pas de problèmes avec GetRentryassembly (); Il ne renvoie que NULL, lorsqu'on l'appelait de code non géré - ou du moins cela ne signifie pas pour moi, car j'utilise exécudeasbly () pour créer / exécuter la deuxième AppDomain, un peu comme celui-ci: P>
int Main(string[] args) { string currentExecutable = Assembly.GetExecutingAssembly().Location; bool inChild = false; List<string> xargs = new List<string>(); foreach (string arg in xargs) { if (arg.Equals("-child")) { inChild = true; } /* Parse other command line arguments */ else { xargs.Add(arg); } } if (!inChild) { AppDomainSetup info = new AppDomainSetup(); info.ConfigurationFile = /* Path to desired App.Config File */; Evidence evidence = AppDomain.CurrentDomain.Evidence; AppDomain domain = AppDomain.CreateDomain(friendlyName, evidence, info); xargs.Add("-child"); // Prevent recursion return domain.ExecuteAssembly(currentExecutable, evidence, xargs.ToArray()); } // Execute actual Main-Code, we are in the child domain with the custom app.config return 0; }
Hmmm. Dans mon test de cette approche (c'était différent du vôtre), GetRentryassembly a renvoyé Null. Mais je n'ai pas fait exécuterasbly - j'ai trouvé le "deuxième principal" que j'avais écrit et exécuté cela. Je vais essayer votre approche et voir si cela fonctionne pour moi.
Je pense que exécuterasbly fait la différence. Au moins, les documents disent que GetRentryassembly renvoie l'exécutable, ou i> celui qui est passé à exécuterasbly ().
var configPath = YOUR_PATH; if (!Directory.Exists(ProductFolder)) { Directory.CreateDirectory(ProductFolder); } if (!File.Exists(configPath)) { File.WriteAllText(configPath, Resources.App); } var map = new ExeConfigurationFileMap { ExeConfigFilename = configPath, LocalUserConfigFilename = configPath, RoamingUserConfigFilename = configPath }; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); Then use config member as you want.
Cela pourrait être utile pour certains autres utilisateurs, mais ne fait rien pour résoudre le problème de l'OP. Il indique explicitement pourquoi cette approche ne peut pas fonctionner pour lui dans la question. Plus précisément, diverses classes-cadres (configuration WCF par exemple) obtiennent des paramètres du fichier de configuration dans l'emplacement par défaut ... Vous ne pouvez pas les influencer à la place pour utiliser la configuration code> instance code> dans votre variable "Config".
Une autre approche consiste à laisser le fichier de configuration avec le fichier exécutable et à déplacer les sections modifiables correspondantes vers des fichiers XML externes pouvant être dans l'emplacement de votre choix.
Si vous utilisez votre fichier de configuration dans une capacité réadonnée, puis Vous pouvez ajouter les morceaux pertinents à un fichier XML dans un emplacement différent à l'aide de XML InlCude. Cela ne fonctionnera pas si vous essayez d'écrire des valeurs directement à l'application app.config à l'aide de la méthode Configuration.Save. P>
app.config: p>
P>
<xi:include href="http://www.whitehouse.gov/malapropisms.xml"> <xi:fallback> <para> This administration is doing everything we can to end the stalemate in an efficient way. We're making the right decisions to bring the solution to an end. </para> </xi:fallback>