Comment obtenez-vous le répertoire de projet actuel à partir du code C# lors de la création d'une tâche MSBuild personnalisée?

Au lieu d'exécuter un programme externe avec son chemin codé en dur, je voudrais obtenir le répertoire du projet actuel. J'appelle un programme externe en utilisant un processus dans la tâche personnalisée.

Comment ferais-je ça? Domaine d'application.CurrentDomain.BaseDirectory me donne juste L'emplacement de VS 2008.

89
demandé sur sean 2009-05-03 12:14:58

15 réponses

, Vous pouvez essayer l'une de ces deux méthodes.

string startupPath = System.IO.Directory.GetCurrentDirectory();

string startupPath = Environment.CurrentDirectory;

Dites-moi, lequel vous semble le mieux

84
répondu Iralda Mitro 2009-05-03 08:32:53

J'espère que cela aidera:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

Cela obtiendra le répertoire du projet

184
répondu mohammed sameeh 2014-04-27 02:22:47

Cela vous donnera également le répertoire du projet en naviguant à deux niveaux à partir du répertoire d'exécution en cours (cela ne retournera pas le répertoire du projet pour chaque build, mais c'est le plus commun).

System.IO.Path.GetFullPath(@"..\..\")

Bien sûr, vous voudriez le contenir dans une sorte de logique de validation/gestion des erreurs.

13
répondu nh43de 2015-09-16 21:58:38

Si vous voulez savoir quel est le répertoire où se trouve votre solution, vous devez le faire:

 var parent = Directory.GetParent(Directory.GetCurrentDirectory()).Parent;
            if (parent != null)
            {
                var directoryInfo = parent.Parent;
                string startDirectory = null;
                if (directoryInfo != null)
                {
                    startDirectory = directoryInfo.FullName;
                }
                if (startDirectory != null)
                { /*Do whatever you want "startDirectory" variable*/}
            }

Si vous ne laissez qu'avec la méthode GetCurrrentDirectory(), vous obtenez le dossier de construction, peu importe si vous déboguez ou relâchez. J'espère que cela aide! Si vous oubliez les validations, ce serait comme ceci:

var startDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
8
répondu abel406 2013-05-23 19:02:56

Si un projet est en cours D'exécution sur un IIS express, le {[1] } pourrait pointer vers L'emplacement D'IIS Express ( le chemin par défaut serait C:\Program fichiers (x86)\IIS Express), pas à l'endroit où réside votre projet.


C'est probablement le chemin de répertoire le plus approprié pour différents types de projets.

AppDomain.CurrentDomain.BaseDirectory

C'est la définition MSDN.

Obtient le répertoire de base que le résolveur d'assembly utilise pour sonder les assemblys.

6
répondu hina10531 2018-09-05 00:29:40

Je cherchais ça aussi. J'ai un projet qui exécute HWC, et je voudrais garder le site web hors de l'arborescence des applications, mais je ne veux pas le garder dans le répertoire debug (ou release). FWIW, la solution acceptée (et celle-ci aussi) n'identifie que le répertoire dans lequel l'exécutable s'exécute.

Pour trouver ce répertoire, j'ai utilisé

string startupPath = System.IO.Path.GetFullPath(".\\").
5
répondu Brett 2011-08-22 05:21:09

Une Autre façon de le faire

string startupPath = System.IO.Directory.GetParent(@"./").FullName;

Si vous voulez obtenir le chemin du dossier bin

string startupPath = System.IO.Directory.GetParent(@"../").FullName;

Peut-être y a-t-il un meilleur moyen=)

4
répondu Tret 2015-06-16 11:19:53

Encore une autre solution imparfaite (mais peut-être un peu plus proche de la perfection que certaines des autres):

    protected static string GetSolutionFSPath() {
        return System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.FullName;
    }
    protected static string GetProjectFSPath() {
        return String.Format("{0}\\{1}", GetSolutionFSPath(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }

Cette version renverra le dossierdes projets en cours même si le projet en cours n'est pas le Startup Project de la solution.

Le premier défaut avec ceci est que j'ai ignoré toute vérification d'erreur. Cela peut être corrigé assez facilement mais ne devrait être un problème que si vous stockez votre projet dans le répertoire racine du lecteur ou si vous utilisez une jonction dans votre chemin (et cela junction est un descendant du dossier solution) donc ce scénario est peu probable. Je ne suis pas tout à fait sûr que Visual Studio puisse gérer l'une ou l'autre de ces configurations de toute façon.

Un autre problème (plus probable) que vous pouvez rencontrer est que le nom du projet doit correspondre au nom du dossier du projet pour qu'il soit trouvé.

Un autre problème que vous pourriez avoir est que le projet doit être dans le dossier de la solution. Ce n'est généralement pas un problème, mais si vous avez utilisé l'option Add Existing Project to Solution pour ajouter le projet à la solution alors cela peut ne pas être la façon dont votre solution est organisée.

Enfin, si votre application modifie le répertoire de travail, vous devez stocker cette valeur avant de le faire car cette valeur est déterminée par rapport au répertoire de travail actuel.

Bien sûr, tout cela signifie également que vous ne devez pas modifier les valeurs par défaut de vos projets' Build->Output path ou Debug->Working directory options dans la boîte de dialogue Propriétés du projet.

4
répondu krowe 2015-10-10 15:46:51

Après avoir finalement fini de polir ma première réponse concernant les États-Unis des chaînes publiques pour dériver une réponse, il m'est apparu que vous pourriez probablement lire une valeur du Registre pour obtenir le résultat souhaité. Il s'avère que cette route était encore plus courte:

Tout D'abord, vous devez inclure Microsoft.Espace de noms Win32 afin que vous puissiez travailler avec le registre:

using Microsoft.Win32;    // required for reading and / or writing the registry

Voici le code principal:

RegistryKey Projects_Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\9.0", false);
string DirProject = (string)Projects_Key.GetValue(@"DefaultNewProjectLocation");

Une note sur cette réponse:

J'utilise Visual Studio 2008 Édition Professionnelle. Si vous utilisez une autre version, (c.-à-d. 2003, 2005, 2010, etc.), alors vous ne devrez peut-être pas modifier la partie 'version' de la chaîne de sous-clé (c'est-à-dire 8.0, 7.0, etc.).

Si vous utilisez l'un de mes réponses, et si elle n'est pas trop demander, alors je voudrais savoir lequel de mes méthodes utilisées et pourquoi. Bonne chance.

  • dm
3
répondu digitalmythology 2012-02-15 16:49:44

J'ai eu une situation similaire, et après des Googles infructueux, j'ai déclaré une chaîne publique, qui Modise une valeur de chaîne du chemin debug / release pour obtenir le chemin du projet. Un avantage de l'utilisation de cette méthode est que, puisqu'elle utilise le répertoire du projet currect, cela n'a pas d'importance si vous travaillez à partir d'un répertoire de débogage ou d'un répertoire de publication:

public string DirProject()
{
    string DirDebug = System.IO.Directory.GetCurrentDirectory();
    string DirProject = DirDebug;

    for (int counter_slash = 0; counter_slash < 4; counter_slash++)
    {
        DirProject = DirProject.Substring(0, DirProject.LastIndexOf(@"\"));
    }

    return DirProject;
}

Vous seriez alors en mesure de l'appeler quand vous voulez, en utilisant une seule ligne:

string MyProjectDir = DirProject();

Cela devrait fonctionner dans la plupart des cas.

3
répondu digitalmythology 2012-10-28 09:12:20

Utilisez ceci pour obtenir le répertoire du projet (travaillé pour moi):

string projectPath = 
    Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
3
répondu user5219877 2015-08-12 15:22:05

Essayez ceci, c'est simple

HttpContext.Current.Server.MapPath("~/FolderName/");
3
répondu Hardeep Singh 2018-07-12 07:31:29

, La meilleure solution

string PjFolder1 =
    Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).
        Parent.Parent.FullName;

Autre solution

string pjFolder2 = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(
                System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)));

Testez-le, AppDomain.CurrentDomain.BaseDirectory a travaillé pour moi sur le projet passé, maintenant je reçois le dossier de débogage .... la bonne réponse sélectionnée ne fonctionne tout simplement pas!.

//Project DEBUG folder, but STILL PROJECT FOLDER
string pjDebugFolder = AppDomain.CurrentDomain.BaseDirectory;

//Visual studio folder, NOT PROJECT FOLDER
//This solutions just not work
string vsFolder = Directory.GetCurrentDirectory();
string vsFolder2 = Environment.CurrentDirectory;
string vsFolder3 = Path.GetFullPath(".\\");   

//Current PROJECT FOLDER
string ProjectFolder = 
    //Get Debug Folder object from BaseDirectory ( the same with end slash)
    Directory.GetParent(pjDebugFolder).
    Parent.//Bin Folder object
    Parent. //Project Folder object
    FullName;//Project Folder complete path
0
répondu Eduardo Chávez 2018-09-04 17:47:32

J'ai utilisé la solution suivante pour faire le travail:

string projectDir = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\.."));
0
répondu Gucu112 2018-09-19 09:01:18

Répertoire.GetParent (Répertoire.GetCurrentDirectory ()).Parent.Parent.Parent.Parent.FullName

Vous donnera le répertoire du projet.

-7
répondu brian kitcehner 2010-11-23 19:36:28