2009-03-13 3 views
3

J'ai un tas de projets DLL que j'intègre dans mon application, chacun contient son propre fichier Settings.settings/app.config. Lorsque je compile l'application et l'exécute pour le débogage, tout fonctionne très bien, mais le temps de déploiement arrive, je ne peux pas obtenir mes DLL pour lire leurs propres fichiers de paramètres.Comment puis-je référencer des informations de configuration à l'intérieur de plusieurs bibliothèques de classes?

J'ai fait quelques lectures et il est devenu évident qu'il y a quelques méthodes pour obtenir que chaque DLL lise sa propre configuration - l'une est de dédier un fichier .dll.config à la bibliothèque et l'autre est d'intégrer la configuration de la DLL dans process.exe.config. Je rencontre des problèmes importants en essayant de mettre en œuvre soit et je me demandais si quelqu'un a de bons docs à ce sujet - il semble y avoir une pénurie sur le Net. Je souhaite un fichier .dll.config distinct pour chacune des bibliothèques si possible, mais à la rigueur, faire en sorte que chacune de mes bibliothèques lise sa propre section de process.exe.config. Est-ce que n'importe qui peut m'indiquer dans la bonne direction parce que je suis si près de rouler cette application dehors mais cette pierre d'achoppement me cause un mal de tête significatif. Lorsque je fusionne les fichiers de configuration, je commence à recevoir des exceptions TypeInitializer lorsque j'initialise des objets avec mes bibliothèques. Ceci est probablement juste que je suis retardé, mais est-ce que quelqu'un a un exemple de travail d'un fichier de configuration fusionné et un code démonstratif de base pour le lire à partir de plusieurs assemblées?

Répondre

2

Quels sont les «problèmes significatifs» que vous avez rencontrés? J'ai commencé par intégrer la configuration de la DLL dans la configuration de l'exe, ce qui fonctionnait, mais était lourd. J'ai maintenant tous les trucs de config dans un projet dll. La seule chose que je devais faire pour faire ce travail (en plus de copier les paramètres) était de changer la classe Settings pour qu'elle soit publique.

Voici un exemple d'une app.config fusionnée qui fonctionne:

<?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="SharedConfig.Client.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     <!-- Begin copy from library app.config --> 
     <section name="SharedConfig.Library.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     <!-- End copy from library app.config --> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <SharedConfig.Client.Properties.Settings> 
     <setting name="Bar" serializeAs="String"> 
      <value>BarFromClient</value> 
     </setting> 
     </SharedConfig.Client.Properties.Settings> 
     <!-- Begin copy from library app.config --> 
     <SharedConfig.Library.Properties.Settings> 
     <setting name="Bar" serializeAs="String"> 
      <value>BarFromLibrary</value> 
     </setting> 
     </SharedConfig.Library.Properties.Settings> 
     <!-- End copy from library app.config --> 
    </applicationSettings> 
    </configuration> 
+0

J'ai tenté ceci dans le premier cas parce que je pensais que ce serait une solution rapide (si un peu sale) à la question et que je pourrais l'obtenir. Mais à la minute où j'ai fusionné tous les fichiers de configuration, j'ai commencé à obtenir des exceptions TypeInitializer essayant d'initialiser mes objets dans mes bibliothèques. – BenAlabaster

+0

Ensuite, je suis allé à tenter d'avoir dédié .dll.configs et je ne peux pas obtenir les bibliothèques pour référencer leurs propres fichiers, je sais que c'est quelque chose de simple que je fais mal - mais même OpenExeConfiguration ne semble pas vouloir faire parce que les fichiers Settings.settings ne semblent pas mise à jour – BenAlabaster

+0

Basé sur mon expérience, je ne suis pas surpris que vous n'ayez pas été très loin avec chaque fichier .dll chargeant sa propre config. D'un autre côté, votre problème avec le premier scénario m'a étonné. Peut-être quelque chose à propos de la façon dont vous les avez fusionnés? –

0

Chaque bibliothèque de classes définit les paramètres de configuration dans une ConfigurationSection personnalisée. Puis ajoutez les gestionnaires de section personnalisés à votre fichier process.exe.config.

This MSDN article est assez complet dans son explication, avec des exemples dans VB et C#.

+0

J'ai dû le faire par le passé - c'est BEAUCOUP de travail étant donné que les bibliothèques et l'assemblage principal sont presque terminés. – BenAlabaster

+0

Oui, cela implique d'écrire du code assez répétitif! Dmitryr a créé un outil pour générer les sections de configuration à partir d'un fragment d'une configuration XML, ce qui peut aider: http://blogs.msdn.com/dmitryr/archive/2005/10/02/476245.aspx –

0

Voir If app.config for a DLL should be in the "main config"… what do we do with WCF References in DLLs?. La vraie réponse est "copier et coller". C'est malheureusement la solution générale que Microsoft avait en tête. Dans certains cas, le mécanisme des paramètres .NET 2.0 peut être utilisé car il place les valeurs par défaut dans la DLL elle-même. Lors de l'exécution, la DLL peut enregistrer les paramètres mis à jour dans le fichier .exe.config.

+0

Je n'ai pas besoin d'avoir les paramètres de sauvegarde de la DLL - ils sont en lecture seule. Le problème est que je ne peux pas obtenir les DLL pour charger leurs paramètres à partir du fichier fusionné process.exe.config. La minute où je fusionne les fichiers de configuration, je commence à obtenir des exceptions TypeInitializer. – BenAlabaster

+0

Vous devez modifier votre message et ajouter un exemple de l'exception que vous recevez (trace de pile complète, s'il vous plaît, et toutes les exceptions internes). Fournissez également l'extrait de configuration concerné. Votre application principale a-t-elle chargé les assemblys contenant les types de sections config? –

Questions connexes