2009-09-09 5 views
4

Je développe une application Windows Forms .NET 3.5. J'ai deux projets, l'interface utilisateur et une bibliothèque. L'interface utilisateur utilise des paramètres fortement typés qui sont stockés, comme d'habitude, dans le fichier app.config. Je les lis en utilisant la classe UI.Properties.Settings (générée par Visual Studio). Bibliothèque utilise ses propres paramètres fortement typés (le fichier Settings.settings qui est sauvegardé dans le fichier Library.config).Paramètres spécifiques à l'assemblage ne se chargeant pas à l'exécution

Lors de l'exécution, les paramètres de la bibliothèque ne seront pas rechargés à partir du fichier Library.config. Seul le fichier UI.config est lu par le moteur d'exécution. Je suis donc bloqué avec les paramètres par défaut dans l'assemblage de la bibliothèque, et je ne peux pas fournir de valeurs après le déploiement. Pour résumer: pour un assembly d'application qui n'est pas l'exécutable principal, les paramètres ne sont pas lus au moment du chargement de l'assembly. Je sais que je peux utiliser ConfigurationManager.AppSettings ["value"] et cela va lire à partir du fichier de configuration de l'application par défaut (UI.config) mais que puis-je faire si je veux des paramètres fortement typés (lire avec la classe Properties.Settings)? Appeler Library.Properties.Settings.Default.Reload() ne le fera pas.

Merci.

Répondre

5

Ce que vous devez faire est de fusionner vos sections de configuration de bibliothèque à app.connfig. La fusion des fichiers de configuration s'effectue en ajoutant d'abord des éléments dans l'élément < configSections> config, afin d'identifier la section de configuration, puis en ajoutant les éléments de configuration à l'intérieur de l'élément de configuration.

Exemple de fusion des fichiers de configuration:

config App:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="CA3.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <CA3.Settings> 
      <setting name="Setting" serializeAs="String"> 
       <value>2</value> 
      </setting> 
     </CA3.Settings> 
    </userSettings> 
</configuration> 

config Bibliothèque:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="CA3.Library" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <CA3.Library> 
      <setting name="Setting" serializeAs="String"> 
       <value>1</value> 
      </setting> 
     </CA3.Library> 
    </userSettings> 
</configuration> 

app.config Fusionné contenant à la fois bibliothèque et configuration de l'application.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="CA3.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
      <section name="CA3.Library" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <CA3.Settings> 
      <setting name="Setting" serializeAs="String"> 
       <value>2</value> 
      </setting> 
     </CA3.Settings> 
     <CA3.Library> 
      <setting name="Setting" serializeAs="String"> 
       <value>1</value> 
      </setting> 
     </CA3.Library> 
    </userSettings> 
</configuration> 
+0

Oui, merci, j'ai déjà essayé la même solution avec ma solution de test et cela fonctionne. Ce n'est pas straioghtforward, je dois fusionner manuellement les fichiers de configuration, mais je peux utiliser la classe générée pour accéder aux paramètres, ce qui est bon. Je n'aime vraiment pas utiliser des chaînes comme ConfigurationManager.AppSettings ["Color"]. –

+0

Eh bien, votre réponse est venue plus tôt que la mienne, alors j'ai supprimé le mien. Merci encore! –

4

Vous ne pouvez avoir qu'un fichier .config par AppDomain. Pour une application Windows Forms, ce fichier .config est le fichier nommé après l'exécutable, c'est-à-dire: UI.exe.config dans votre cas. Cela signifie que, même si vous avez le fichier Library.dll.config présent, le système de configuration ne le récupèrera jamais.

Vous devez fusionner les paramètres de configuration de la bibliothèque dans le fichier de configuration de l'application. Les fichiers de configuration pour les bibliothèques ne sont pas pris en charge par le framework .NET.

Encore mieux, redessinez votre bibliothèque pour qu'elle ne repose pas sur les fichiers de configuration, mais utilise plutôt Imperative Configuration.

+0

Merci, je vais vérifier votre publication. Un fichier de configuration me laisse avec le problème de ne pas pouvoir accéder aux paramètres dans la bibliothèque en utilisant ma classe fortement typée. –

+0

@Vasi: Comme je l'ai mentionné ci-dessus, et comme Pop Catalin le démontre dans sa réponse, vous pouvez fusionner les paramètres de votre bibliothèque dans le fichier de configuration de l'application. –

Questions connexes