2009-07-01 14 views
1

J'ai une application WinForms ("WF"), et une bibliothèque appelée par cette application WinForms ("LIB")Accès aux paramètres (app.config) de l'application appelante

WF a une Settings.settings (Visual Studio Designer) et app.config combo. Je suppose que le concepteur est un frontal qui génère automatiquement le fichier app.config. Pour utiliser ces paramètres depuis WF, j'utilise les propriétés fortement typées de la classe qu'il génère automatiquement (c'est-à-dire WF.Settings.MyTimeOutSetting).

Lorsque WF appelle une méthode dans LIB, je souhaite utiliser l'un des paramètres de WF dans lib. Comment puis-je récupérer un paramètre à partir de app.config de l'appelant (WF) dans le code de l'appelé (LIB)?

Répondre

4

L'appelant (exe dans ce cas) doit transmettre les informations nécessaires à la DLL. De cette façon, vous pouvez réutiliser la DLL plus tard, ailleurs et ne pas avoir de dépendance 'invisible' sur un paramètre app.config.

Essayez ceci:

Dim oConfiguration As System.Configuration.Configuration 
oConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
Dim sValue As String = oConfiguration.AppSettings.Settings("setting").Value 
+0

Oui, ça m'irrite aussi! – bbqchickenrobot

+0

Je n'ai pas répondu parce que je ne pensais pas qu'il lui faudrait longtemps pour trouver la mauvaise façon de le faire. J'ai répondu six minutes après la question, à ce moment-là il aurait pu encore penser que c'était une bonne idée. Maintenant qu'il a décidé qu'il ne se soucie pas de la réutilisation, il n'y a aucune raison pour qu'il ne sache pas comment le faire. –

+0

Les gars, préférez-vous répondre immédiatement avec quelque chose qui causera des problèmes plus tard, ou pour vous assurer que le questionneur sait ce qu'il demande? Il n'a donné aucune indication qu'il n'appellerait jamais ce code d'un appelant différent, et a employé le terme «bibliothèque», qui implique la réutilisation. Cette réponse répond à sa question, mais limite la réutilisation. D'autres liront ceci, et je veux m'assurer qu'ils savent pourquoi. –

0

De la même manière que vous le feriez dans les formulaires Windows. Il cherchera atomiquement dans l'app.config de l'application appelante en premier

+0

LIB ne fait pas référence WF. Il n'a donc aucune connaissance de la classe WF.Settings générée automatiquement. – xyz

+0

vous devrez peut-être ajouter un fichier app.config à votre bizlayer à des fins de compilation/intellisense, mais il ne l'utilisera pas lors de l'exécution. Vous faites la même chose pour des choses comme SubSonic ou EntityFramework –

+0

Voici un autre lien vers une question similaire mais il se peut que ce ne soit pas exactement ce dont vous avez besoin http://stackoverflow.com/questions/685259/getting-configuration-settings-from-web- config-app-config-using-class-library –

1

Ajoutez une référence à System.Configuration à votre projet.

Puis, dans les .cs particuliers ou .vb (ou autre) fichier que vous êtes désireux de faire une référence au fichier de configuration, ajoutez les éléments suivants:

C#: using System.Configuration; VB: Imports System.Configuration

alors vous pouvez accéder à la configuration Web en utilisant quelque chose comme ceci:

C#: System.Configuration.COnfigurationManager.AppSettings [ "THE_SETTING_U_WANT"];

VB: System.Configuration.COnfigurationManager.AppSettings (« THE_SETTING_U_WANT »)

Si vous voulez une section complète, je pense qu'il existe des méthodes dans cette classe pour le faire aussi bien.

+0

Cela semble fonctionner correctement, mais AppSettings a Count = 0 et l'indexeur renvoie null – xyz

+0

Cela fonctionne toujours très bien pour moi ... mais cela dépend de ce que vous êtes info essayer de récupérer. Quels paramètres essayez-vous de récupérer dans votre app.config? Si c'est dans la section , cela ne fonctionnerait pas. Vous pouvez également utiliser GetSection() ou vous pouvez déplacer les informations que vous souhaitez récupérer dans la section en supposant qu'elles correspondent au paradigme clé/valeur. - De même, si vous tentez de récupérer une chaîne de connexion, vous pouvez essayer: ConfigurationManager.ConnectionStrings ["NameOfConnStirng"]; – bbqchickenrobot

+0

Cela peut vous aider un peu: http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager_members.aspx – bbqchickenrobot

3

La réponse est: ne le faites pas.

L'application appelante vous transmettra tout ce que vous avez besoin de savoir dans l'appel, ou peut-être dans votre constructeur. Le composant appelé ne devrait pas exiger la connaissance de l'appelant. Comme John l'a dit, c'est une mauvaise idée.

+0

Ce n'est pas obligatoire - c'est juste utile. Je parie qu'il existe un moyen reconnu de le faire. – xyz

+1

La manière reconnue est de ne pas le faire. Séparation des préoccupations, développement basé sur des composants; ces choses impliquent que l'appelant doit fournir à l'appelé avec ce dont il a besoin. De cette façon, il peut être appelé dans un contexte différent. –

+0

Pour autant que je sache, l'application dans app.config représente AppDomain, et ils sont dans le même AppDomain. Comme je l'ai dit, le réglage n'est pas nécessaire, il est juste utile d'utiliser comme indice. – xyz