6
votes

Accéder à des propriétés.Settings usersettings d'une DLL

Un composant de l'interface graphique de mon application principale est son propre projet, et l'application principale utilise simplement le fichier d'interface graphique lors de la course. Étant donné que les usersettings sont stockés dans le composant GUI Composant's APP.CONFIG , que l'application principale ne copie pas, je ne peux pas enregistrer des questionnaires (no user.config créé).

Les voies possibles autour de ce que je vois sont soit en mesure de stocker le fichier composant dans un fichier de configuration externe (référencé par son app.config ) copié à Le répertoire principal de l'application au moment de l'exécution ou mettant en place tous les usersettings au niveau de l'application principale (car son .exe.config est copié) et l'accédant à partir du composant GUI.

Cependant, je n'ai pas été en mesure d'obtenir de ces méthodes pour économiser pour enregistrer les . Des idées? Si une clarification est nécessaire, merci de me le faire savoir.


0 commentaires

3 Réponses :


1
votes

ah - les propriétés terribles.Settings!

Il y a plusieurs façons autour de cela, mais tous impliquent un peu de retravailler.

simple - utilisez des applications à la place des applications: Copiez les applications requises dans chaque application qui l'utilise.

Avantages: facile, inconvénient: configuration Paramètres partout!

Créer une section de configuration personnalisée: Beaucoup d'articles à ce sujet - voir http://joelabrahamsson.com/ientry/creatier-a-custom-configuration-section-in-net par exemple.

Fondamentalement, vous auriez alors votre fichier de configuration séparé que vous copieriez dans chaque déploiement qui l'avait requis - il suffit de référencer simplement l'assemblage dans lequel vous créez vos objets de configuration dans chaque déploiement qui en a besoin et mettez à jour le fichier de configuration de l'application pour référence. Le fichier de configuration personnalisé inclus.

Avantages: Tidy, vous pouvez envelopper la validation à l'intérieur de l'objet de configuration, des fichiers de configuration de Tipeier, des inconvénients: prend un peu plus de temps à configurer.

Il y en a d'autres - y compris de stocker des valeurs dans un fichier XML et de le désérialiser à une classe au moment de l'exécution. En utilisant la même approche, mais stocker dans une base de données à la place. etc.c etc.


3 commentaires

Est-ce la façon dont la première option fonctionnerait? -> L'application lit les valeurs par défaut dans le fichier AppSettings la première fois qu'elle s'exécute. L'utilisateur (non administrateur) modifie / enregistre ces paramètres (à partir de l'application principale) - mais l'application enregistrera-la dans un fichier utilisateur dans un répertoire AppData. Ensuite, l'application principale tente de trouver d'abord un fichier de paramètres d'utilisateur avant d'essayer de lire le fichier Appssettings d'origine. Je voulais juste clarifier si c'est ainsi que cela fonctionnerait.


Vous pouvez définir un chemin d'accès à un fichier de configuration distinct dans Appsettings - cela pourrait être un fichier partagé que tous les déploiables utilisent. codeproject.com/kb/dotnet/appsettings_fileattribute.aspx


Je conseillerais cependant de prendre la 2e option plutôt que de l'approche ci-dessus - cela vous servira mieux à long terme.



6
votes

Vous devriez être capable de déplacer les paramètres à partir des propriétés du projet principal aux propriétés de votre DLL de votre composant GUI (ou de créer un paramètres.dll si vous préférez).

Référencez ensuite cette DLL de votre application principale et ajoutez à l'aide des instructions afin que vous puissiez accéder à paramètres.default . Vous devez ensuite changer le modificateur d'accès du fichier de paramètres. C'est un peu non évident mais expliqué dans le Documentation MSDN . Voici une capture d'écran:

Entrez la description de l'image ici

Une fois que vous avez changé ceci en "public", vous pouvez simplement lire les paramètres de n'importe où sur votre application.

AVERTISSEMENT: N'a pas plus de 1 paramètres par application en cours d'exécution car la mise en œuvre est un singleton et vous obtiendrez des résultats inattendus. Si vous avez une copie des paramètres, il n'a pas besoin d'être dans la DLL .exe - Cela peut être partout où vous le souhaitez.

Je suppose que vous n'essayez pas de réutiliser à travers les applications.


0 commentaires

0
votes

Voici comment j'ai approché une solution à ce problème. Supposons que nous construisons mydll.dll et nous voulons le configurer avec un fichier mydll.dll.config. Premièrement, prenez des extraits des sections du fichier mydll.dll.config contenant les paramètres de propriété.

path = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(path))
{
  throw new Exception("Config file not found:\r\n" + path);
}
serializer = new XmlSerializer(typeof(configuration));
using (StreamReader sr = new StreamReader(path))
{
  _Cfg = (configuration)serializer.Deserialize(sr);
}
if (_Cfg.applicationSettings.MyDllPropertiesSettings == null)
{
  throw new Exception("Property settings not found.");
}
stg = _Cfg.applicationSettings.MyDllPropertiesSettings
                 .FirstOrDefault(x => x.name == "MySvrName");
if (object.ReferenceEquals(stg, null))
{
  throw new Exception("Can't find setting 'MySvrName'");
}
_SvrName = stg.value;
stg = _Cfg.applicationSettings.MyDllPropertiesSettings
             .FirstOrDefault(x => x.name == "MyDbName");
if (object.ReferenceEquals(stg, null))
{
  throw new Exception("Can't find setting 'MyDbName'");
}
_DbName = stg.value;


0 commentaires