Как получить текущий каталог проекта из кода C# при создании пользовательской задачи MSBuild?
вместо того, чтобы запускать внешнюю программу с жестко заданным путем, я хотел бы получить текущий проект Dir. Я вызываю внешнюю программу, используя процесс в пользовательской задаче.
Как бы я это сделал? домен приложений.CurrentDomain.BaseDirectory просто дает мне расположение VS 2008.
15 ответов:
вы можете попробовать один из этих двух методов.
string startupPath = System.IO.Directory.GetCurrentDirectory(); string startupPath = Environment.CurrentDirectory;скажите, какой из них вам кажется лучше
Я надеюсь, что это поможет:
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;Это позволит получить каталог проекта
это также даст вам каталог проекта, Перейдя на два уровня вверх от текущего исполняемого каталога (это не вернет каталог проекта для каждой сборки, но это наиболее распространенный).
System.IO.Path.GetFullPath(@"..\..\")конечно, вы хотели бы содержать это в какой-то проверки/обработки ошибок.
Если вы хотите узнать, что такое каталог, в котором находится ваше решение, вам нужно сделать это:
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*/} }Если вы позволите только с
GetCurrrentDirectory()метод, вы получаете папку сборки независимо от того, если вы отладки или выпуска. Я надеюсь, что это поможет! Если вы забудете о проверках, это будет выглядеть так:var startDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
Если проект выполняется на IIS express, то
Environment.CurrentDirectoryможет указывать, где находится IIS Express ( путь по умолчанию будет C:\Program файлы (x86)\IIS Express ), а не туда, где находится проект.
это, вероятно, наиболее подходящий путь к каталогу для различных видов проектов.
AppDomain.CurrentDomain.BaseDirectoryэто определение MSDN.
возвращает базовый каталог, который сопоставитель сборок использует для поиска сборки.
Я тоже это искал. У меня есть проект, который запускает HWC, и я хотел бы сохранить веб-сайт из дерева приложений, но я не хочу держать его в каталоге отладки (или выпуска). FWIW, принятое решение (и это тоже) только идентифицирует каталог, в котором работает исполняемый файл.
найти этот каталог, я использую
string startupPath = System.IO.Path.GetFullPath(".\").
еще один способ сделать это
string startupPath = System.IO.Directory.GetParent(@"./").FullName;Если вы хотите получить путь к папке bin
string startupPath = System.IO.Directory.GetParent(@"../").FullName;может быть, есть лучший способ =)
еще одно несовершенное решение (но, возможно, немного ближе к идеалу, чем некоторые другие):
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); }эта версия вернет текущие проекты' папка, даже если текущий проект не является
Startup Projectдля решения.первый недостаток заключается в том, что я пропустил все проверки ошибок. Это можно исправить достаточно легко, но это должно быть проблемой только в том случае, если вы храните свой проект в корневом каталоге для диска или используете соединение в вашем пути (и это соединение является потомком папки решения), поэтому этот сценарий маловероятен. Я не совсем уверен, что Visual Studio может справиться с любой из этих настроек в любом случае.
еще одна (более вероятная) проблема, с которой вы можете столкнуться, заключается в том, что имя проекта должны сопоставьте имя папки для проекта, чтобы он был найден.
другая проблема может быть в том, что проект должен находиться в папке решения. Это, как правило, не проблема, но если вы использовали
Add Existing Project to Solutionвозможность добавить проект в решение, то это может быть не так, как ваше решение организовано.наконец, если вы приложение будет изменять рабочий каталог, вы должны сохранить это значение, прежде чем делать это, потому что это значение определяется относительно текущего рабочего каталога.
конечно, это все также означает, что вы не должны изменять значения по умолчанию для ваших проектов'
Build->Output pathилиDebug->Working directoryпараметры в диалоговом окне свойства проекта.
после того, как я, наконец, закончил полировку своего первого ответа относительно использования публичных строк для получения ответа, мне пришло в голову, что вы, вероятно, можете прочитать значение из реестра, чтобы получить желаемый результат. Как оказалось, этот маршрут был еще короче:
во-первых, вы должны включить Microsoft.Win32 пространство имен, так что вы можете работать с реестром:
using Microsoft.Win32; // required for reading and / or writing the registryвот основной код:
RegistryKey Projects_Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio.0", false); string DirProject = (string)Projects_Key.GetValue(@"DefaultNewProjectLocation");примечание к этому ответу:
Я использование Visual Studio 2008 Professional Edition. Если вы используете другую версию, (т. е. 2003, 2005, 2010; и т. д.), то вам может потребоваться изменить часть "версия" строки подраздела (т. е. 8.0, 7.0; и т. д.).
Если вы используете один из моих ответов, и если это не слишком много, чтобы спросить, то я хотел бы знать, какой из моих методов вы использовали и почему. Удача.
- dm
у меня была аналогичная ситуация, и после бесплодных Googles я объявил публичную строку, которая модифицирует строковое значение пути отладки / выпуска, чтобы получить путь к проекту. Преимущество использования этого метода заключается в том, что, поскольку он использует каталог проекта currect, не имеет значения, работаете ли вы из каталога отладки или каталога выпуска:
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; }тогда вы сможете вызвать его, когда захотите, используя только одну строку:
string MyProjectDir = DirProject();Это должно работать в большинство случаях.
используйте это, чтобы получить каталог проекта (работал для меня):
string projectPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
лучшим решением
string PjFolder1 = Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory). Parent.Parent.FullName;другое решение
string pjFolder2 = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)));проверьте его, AppDomain.CurrentDomain.BaseDirectory работал для меня на прошлом проекте, теперь я получаю папку отладки .... выбранный хороший ответ просто не работает!.
//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
я использовал следующее решение, чтобы получить работу:
string projectDir = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\.."));
.GetParent(Каталог.GetCurrentDirectory()).Родитель.Родитель.Родитель.Родитель.Полное имя
даст вам каталог проекта.
Comments