Accès au fichier des paramètres d'un autre projet

y a-t-il un moyen d'accéder au fichier de paramètres 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 du programme.cs in Projet1. Est-ce possible?

38
demandé sur KrisTrip 2010-03-31 00:31:05

6 réponses

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

Option B: créer 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'ensemble dans Proj1 et consommer les valeurs de cette classe.

Option C: Si vous voulez 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 y a d'autres façons.

32
répondu Jay 2014-03-27 14:11:28

la réponse si vous utilisez C#:

la réponse très simple est de cliquer avec le bouton droit de la souris sur proj2, choisissez l'onglet Paramètres. Sur le dessus, vous trouverez le modificateur d'accès des paramètres de la classe est: interne, changer de public. Ajouter une référence au projet2 dans le Projet1 afin de voir la classe paramètres du projet2. C'est tout.

47
répondu Nour El-Dien 2013-02-11 13:54:39

je vais reporter 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 cool 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 la façon dont il est mis en œuvre. Permettez-moi de vous expliquer pourquoi.

Habituellement, les paramètres sont spécifiques à un projet. Lorsque vous ajoutez un paramètre dans un projet spécial de l'outil personnalisé associé avec le fichier de configuration génère une nouvelle classe que vous pouvez utiliser pour y accéder. Ce qui est bien dans cette classe, c'est qu'elle est bien tapée. Mais derrière la scène, c'est juste une clé d'un fichier xml. Cette classe générée est définie comme"interne sealed". Ceci empêche l'accès à partir de n'importe quelle autre assemblée. Si vous souhaitez centraliser où vous modifiez ces paramètres.

après de nombreuses tentatives de 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 il ressemble.

Settings Before

si vous voulez obtenir l'accès aux paramètres du moteur ici 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 réglage sera toujours interne et scellé, mais de WinApp projet au lieu de moteur.

voici le résultat final:

Settings After

notez que j'ai ajouté un dossier avec le même nom que mon projet moteur. Ce sera utile si vous souhaitez ajouter les paramètres de nombreux projets.

avec ceci en place, vous pouvez accéder à votre moteur de réglage de la voie de votre classe de moteur à partir de votre classe WinApp. Vous pouvez omettre la partie" moteur " de votre classe de moteur parce que vous devriez être dans le même espace de nom. Voici à quoi il devrait ressembler:

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

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting = "test";
        }
    }
}
2
répondu woodvi 2017-10-31 21:46:11

j'ai dû trouver une autre solution en plus de celles déjà données ici parce que j'utilisais des Tranforms XML (via SlowCheetah) sur L'application.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 après-construction dans le projet Consumer (Proj1 dans l'exemple) pour copier le fichier de configuration à partir du dossier de sortie de Proj2. Cela permettra de s'assurer que la configuration aura les transformations appliquées. (Dans mon case, Projet1 est une dll, donc si le vôtre est un exe, changer les DestinationFiles de ".DLL.config" pour ".EXE.config".) Extrait de Proj1.csproj:

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

puis j'ai créé un lien des paramètres.paramètres de Proj2 par Ctrl+shift+glisser le fichier vers Proj1 (comme dans l'article de blog référencé par Kildareflare ).

je pourrais alors faire référence à des paramètres dans le Projet1 similaire à: Proj2.Properties.Settings.Default.MySetting .

Note: Si vous faites cela pour des tests unitaires comme je suis (Proj1 est un DLL test), et vous utilisez le ReSharper Test runner, assurez-vous de configurer pour exécuter des tests dans des AppDomains séparés .

0
répondu Matt Miller 2017-05-23 12:26:23

depuis Settings.Designer.cs est une classe internal , et vous ne voulez pas déconner avec un fichier de code généré, je recommande d'ajouter le secondaire comme un projet" ami".

De: C# "interne" modificateur d'accès lors de tests unitaires, 151990920"

ajouter le code suivant au Proj2 's AssemblyInfo.cs

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("Proj1")]
-1
répondu Mugen 2017-10-31 09:30:09

Je n'ai pas testé cette méthode moi-même, mais le petit tour D'Eric de Carufel peut être ce dont vous avez besoin:

http://blog.decarufel.net/2007/10/getting-access-to-settings-in-another.html

le lien original semble être mort car il a déménagé sur un nouveau blog et supprimé les anciens contenus.

le contenu original est le suivant:

accéder aux paramètres d'un autre projet

Le Jeudi 25 Octobre 2007

L'une des nouvelles fonctionnalités cool 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 la façon dont il est mis en œuvre. Permettez-moi de vous expliquer pourquoi.

Habituellement, les paramètres sont spécifiques à un projet. Lorsque vous ajoutez un paramètre dans un projet, un outil spécial personnalisé associé au fichier de paramètre génère une nouvelle classe que vous pouvez utiliser pour y accéder. Ce qui est bien dans cette classe, c'est qu'elle est bien tapée. Mais derrière la scène, c'est juste une clé d'un fichier xml. Cette classe générée est définie comme"interne sealed". Ceci empêche d'être accédé à partir de n'importe quel autre assemblage. Que faire si vous voulez centraliser où vous éditez ces paramètres.

après de nombreuses tentatives de 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. Chaque ont mais nous voulons qu'ils soient éditables à partir de WinApp. Voici à quoi il ressemble.

si vous voulez avoir accès aux réglages du moteur ici: Ajouter un fichier de lien.

le fichier de lien sera compilé dans le cadre de votre projet WinApp. La classe de réglage sera toujours interne et scellé, mais de WinApp projet au lieu de moteur.

voici le résultat final:

notez que j'addes un foler avec le même nom comme mon projet moteur. Cela sera utile si vous voulez ajouter des paramètres de nombreux projets.

avec ceci en place, vous pouvez accéder à votre moteur de réglage de la voie de votre classe de moteur à partir de votre classe WinApp. Vous pouvez omettre la partie" moteur " de votre classe de moteur parce que vous devriez être dans le même espace de nom. Voici à quoi il devrait ressembler:

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

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting = "test";
        }
    }
}
-2
répondu Kildareflare 2018-09-14 15:42:42