8
votes

Modification app.config au moment de l'exécution

J'écris un test WINFORMS / C # / .NET 3.5 Application du système Nous développons et nous sommes tombés dans la nécessité de basculer entre les fichiers .config au moment de l'exécution, mais cela se révèle être un cauchemar. < P> Voici la scène: l'application WinForms vise à tester une webApp, divisée en 5 sous-systèmes. Le processus de test fonctionne avec des messages envoyés entre les sous-systèmes et pour ce processus pour réussir chaque sous-système doit avoir son propre fichier .config.

pour mon application de test, j'ai écrit 5 fichiers de configuration distincts. J'aimerais avoir pu basculer entre ces 5 fichiers pendant l'exécution, mais le problème est que: je peux éditer de manière programmative l'application .config fichier de plusieurs fois, mais ces modifications ne prendront effet qu'une fois. J'ai cherché longtemps pour un formulaire pour résoudre ce problème, mais je n'ai toujours pas eu de succès.

Je sais que la définition de problème peut être un peu déroutant, mais j'apprécierais vraiment que quelqu'un m'a aidé .

Merci d'avance!

--- Mise à jour 01-06-10 ---

Il y a quelque chose que je n'ai pas mentionné auparavant. À l'origine, notre système est une application Web avec des appels WCF entre chaque sous-système. Pour des raisons de test de performance (nous utilisons des fourmis 4), nous avons dû créer une copie locale des assemblées et les référer à partir du projet de test. Cela peut sembler un peu faux, mais nous ne pouvions pas trouver de manière satisfaisante de mesurer la performance d'une application distante.

---- Mise à jour fin ---

Voici ce que je ' m faisant: xxx


2 commentaires

DUP / CONNEXION? Stackoverflow.com/questions/1542171/...


J'ai déjà essayé ces APIOCHES ... Le problème est que la balise que je change est en dehors de . J'ai également essayé de créer de nouvelles AppDomains et de définir différents fichiers .config à eux, mais cela n'a pas fonctionné non plus.


4 Réponses :


1
votes

Je suppose que vous ne ferez pas vraiment la fermeture de la poignée de fichier la première fois que Windows ne "voit" pas "VOIR" que vous apportez les changements ultérieurs.

Mes suggestions consiste à utiliser un appel API vers IIS et désactiver l'application Web (et la piscine), apportez la modification, activez l'application Web. De cette façon, vous êtes sûr qu'il va relire le fichier et avoir un environnement "propre" pour chaque test.


1 commentaires

J'ai mis à jour la question avec quelques détails. Fondamentalement, dans ce contexte (test de performance), nous n'utilisons pas IIS, les assemblées sont référencées localement. J'utilise des bibliothèques XML pour écrire dans le fichier .config. Au cours de l'exécution, je peux voir que le fichier est écrit et modifié.



0
votes

En supposant que le fichier de fichier dans le fichier de configuration est fermé une fois que le fichier de configuration a été lu et traité, j'enverrais un message à l'application pour le dire de relire le fichier de configuration après avoir mis à jour le fichier. Si cette approche ne fonctionne pas, alors je suppose (comme le suggéra Hogan) que le gérant du fichier n'est pas fermé. Quels codes d'erreur recevez-vous de l'ouverture de fichier, de la lecture et de la fermeture des appels de système? (Utilisez Perror pour signaler le message d'erreur)


4 commentaires

Cette approche est intéressante, mais pouvez-vous me donner quelques étapes sur la manière d'envoyer ce message à l'application? J'ai essayé d'appeler ConfigurationManager.refresection () mais cela n'a pas fonctionné.


@born to hula: Comment modifiez-vous la configuration @ runtime? J'utiliserais la même approche pour que l'application relire le fichier de configuration. Quelle langue et quel système d'exploitation utilisez-vous? Quels sont les messages envoyés à l'application pendant les tests? L'entrée à l'application provient-elle d'une page Web? Répondre à ces questions donnerait des indices sur la meilleure approche pour votre situation.


J'utilise XMLDocument pour modifier le fichier .config (reportez-vous à la question mise à jour). Mais, quel que soit le nombre de fois où je le change, les modifications ne seront reflétées qu'une fois sur le contexte d'exécution. J'utilise C # et Windows XP. L'entrée de l'application est directement tirée du formulaire. Fondamentalement, l'entrée principale est un message à partir duquel une variété d'objets est créée.


@born to hula: mon expérience est sur UNIX; pas sous Windows. Désolé.



3
votes

Mise à jour

La solution ci-dessous ne fonctionnait pas car xmldocument ne dispose pas et il semble que certaines versions de .NET ne se ferment pas correctement lorsqu'il est un chemin de fichier. La solution (exemple de code dans la liaison) consiste à ouvrir un flux qui fera un élimination et passer ce flux à la fonction Enregistrer.

une solution est présentée ici. http: //web-beta.archive.org/web/20150107004558/www.devnewsgroups.net/group/microsoft.public.dotnet.xml/topic40736.aspx


Vieux trucs ci-dessous

Essayez ceci:

Note, j'ai changé en XPath, mais cela a été un moment, alors j'ai peut-être pu avoir le mal de XPath, mais dans tous les cas Vous devriez utiliser XPath et ne pas marcher dans l'arbre. Comme vous pouvez le constater, il est beaucoup plus clair.

Le point important est le à l'aide de instruction DISPOSE () , lequel je pense être votre problème.

laissez-moi savoir, bonne chance. xxx


7 commentaires

C'est un peu de sens, le problème est que xmldocument ne s'applique pas non souhaitable. Il n'est donc pas possible d'utiliser l'étendue "Utilisation".


Eh bien, j'ai légèrement estimé que ce n'est pas le cas. J'utilise le cadre .NET 3.5. En outre, je pense que si le flux de fichiers était toujours ouvert, d'ici la deuxième fois, j'essaierais d'écrire au fichier XML, j'aurais une exception ... mais merci de toute façon.


Ummm ... Il existe un problème documenté avec la structure .NET avec un code d'exemple qui ressemble exactement à la même chose que le vôtre, je vous fournis un lien vers le code qui résout ce problème et que vous n'allez pas l'essayer? Tu ne veux pas résoudre le problème?


Je vais essayer d'essayer de vous mettre à jour avec les résultats. Merci de votre aide.


J'ai essayé et apparemment le résultat était la même chose. Merci quand même homme.


Mal - désolé je ne pouvais pas aider.


Le lien DevNewsgroups a été détourné.



26
votes

Je comprends que c'est un bon fil, mais je ne pouvais pas obtenir les méthodes énumérées pour fonctionner. Voici une version plus simple de la méthode UpdateAppsettings (utilisant .NET 4.0): xxx

assez lisible et évite de traverser l'app.config en utilisant XPath ou similaire. Remarque: le code ci-dessus est inspiré de Ce Snippet sur MSDN.


1 commentaires

Ne fonctionne pas dans mon application WinForms, exécute bien, mais pas de changement de * .config