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.
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
J'espère que cela aidera:
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
Cela obtiendra le répertoire du projet
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.
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;
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.
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(".\\").
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=)
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.
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
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.
Utilisez ceci pour obtenir le répertoire du projet (travaillé pour moi):
string projectPath =
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
Essayez ceci, c'est simple
HttpContext.Current.Server.MapPath("~/FolderName/");
, 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
J'ai utilisé la solution suivante pour faire le travail:
string projectDir = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\.."));
Répertoire.GetParent (Répertoire.GetCurrentDirectory ()).Parent.Parent.Parent.Parent.FullName
Vous donnera le répertoire du projet.