web-dev-qa-db-fra.com

Accéder au fichier de paramètres d'un autre projet

Existe-t-il un moyen d'accéder au fichier de paramètres à partir d'un autre projet? Par exemple, j'ai une solution qui contient 2 projets (appelons-les Proj1 et Proj2). Je veux accéder aux paramètres d'application de Proj2 à partir de Program.cs dans Proj1. Est-ce possible?

40
KrisTrip

Option A: analyser les valeurs du fichier de configuration de l'autre assembly (où les paramètres sont stockés)

Option B: créez une classe publique dans Proj2 qui expose les valeurs nécessaires de ses paramètres en tant que propriétés statiques, puis référence l'assembly dans Proj1 et consommer les valeurs de cette classe.

Option C: si vous souhaitez exposer TOUS les paramètres, vous pouvez modifier l'accès de la classe de paramètres de internal à public.

Je suis sûr qu'il existe également d'autres moyens.

32
Jay

La réponse si vous utilisez C #:
La réponse très simple est de faire un clic droit sur proj2, choisissez l'onglet paramètres. En haut, vous trouverez le modificateur d'accès de la classe de paramètres: interne, changez-le en public. Ajoutez une référence au proj2 dans le proj1 afin de voir la classe de paramètres proj2. C'est tout.

50
Nour El-Dien

Je republierai le contenu du lien de @ Kildareflare pour référence future. Fonctionne toujours dans VS2015, mais pour moi, je pense que je préfère "Option B" ci-dessus.

Accès aux paramètres d'un autre projet

L'une des nouvelles fonctionnalités intéressantes de Visual Studio 2005 est le nouvel éditeur de propriétés. Avec cet éditeur de propriétés, vous pouvez facilement ajouter des paramètres à votre application. Mais il y a un problème dans sa mise en œuvre. Laissez-moi vous expliquer pourquoi.

Habituellement, les paramètres sont spécifiques à un projet. Lorsque vous ajoutez un paramètre dans un projet, un outil personnalisé spécial associé au fichier de paramètres génère une nouvelle classe que vous pouvez utiliser pour y accéder. Ce qui est bien avec cette classe, c'est sa forte typographie. Mais derrière la scène, il suffit d'obtenir une clé à partir d'un fichier xml. Cette classe générée est définie comme "scellée en interne". Cela empêche l'accès à partir de tout autre assembly. Que faire si vous souhaitez centraliser où vous modifiez ces paramètres.

Après de nombreuses tentatives pour l'exposer, j'ai trouvé un moyen rapide et facile de le faire. Disons que nous avons 2 projets dans notre solution: un moteur et un WinApp. Chacun a des paramètres mais nous voulons qu'ils soient modifiables à partir de WinApp. Voici à quoi ça ressemble.

Settings Before

Si vous souhaitez accéder aux paramètres du moteur, voici l'astuce: ajouter un fichier de lien.

Add Link

Le fichier de lien sera compilé dans le cadre de votre projet WinApp. La classe de paramètres sera toujours interne et scellée, mais dans le projet WinApp au lieu du moteur.

Voici le résultat final:

Settings After

Notez que j'ai ajouté un dossier portant le même nom que mon projet Engine. Cela sera utile si vous souhaitez ajouter des paramètres à partir de nombreux projets.

Avec cela en place, vous pouvez accéder à votre moteur en définissant le chemin à partir de votre classe de moteur à partir de votre classe WinApp. Vous pouvez omettre la partie "Engine" de votre classe de moteur car vous devez être dans le même espace de noms. Voici à quoi cela devrait ressembler:

namespace WinApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting = "test";
        }
    }
}
4
woodvi

J'ai dû trouver une autre solution que celles déjà données ici car j'utilisais XML Tranforms (via SlowCheetah) sur l'App.config de mon projet contenant les paramètres. Si vous ne le faites pas, je recommande l'une des autres solutions.

J'ai ajouté une étape de post-construction dans le projet consommateur (Proj1 dans l'exemple) pour copier le fichier de configuration depuis le dossier de sortie de Proj2. Cela garantira que la configuration aura les transformations appliquées. (Dans mon cas, Proj1 est une DLL, donc si la vôtre est un exe, changez les DestinationFiles de ".dll.config" en ".exe.config".) Extrait de Proj1.csproj:

<Target Name="AfterBuild">
  <Copy SourceFiles="..\Proj2\bin\$(Configuration)\Proj2.exe.config" DestinationFiles="$(TargetDir)\$(AssemblyName).dll.config" />
</Target>

Ensuite, j'ai créé un lien des paramètres Settings.settings de Proj2 en appuyant sur Ctrl + Maj + en faisant glisser le fichier vers Proj1 (comme dans l'article de blog référencé par Kildareflare).

Je pourrais alors référencer des paramètres dans Proj1 similaires à: Proj2.Properties.Settings.Default.MySetting.

Remarque: Si vous effectuez cette opération pour des tests unitaires comme je le suis (Proj1 est une DLL de test) et que vous utilisez le programme d'exécution de test ReSharper, assurez-vous de configurez-le pour exécuter des tests dans des domaines d'application séparés .

0
Matt Miller